Assignment

Week Five Assignment

Choose a data from UN data or OECD data.

  • Create an R Notebook of a data analysis containing the following and submit the rendered file (e.g., w5_g123456.nb.html) in Moodle.

    1. Create an R Notebook using the R Notebook Template in Moodle and save it as, for example, w5_g123456.Rmd.

    2. Edit author with name, ID, and title.

  • Contents should include the following:

    • A short abstract

    • Information of data including data name, description and link to reach the data

    • Several charts: a bar graph or a column graph, a histogram, a line graph, a scatter plot

    • Observations or questions for visualizations

  • Use left_join, if possible. (a challenge, not required)

  • Run each code block and preview to create, for example, w5_g123456.nb.html.

    • Or, Run All under Run and Preview to check in your web browser!

    • You can also view your file (e.g. w5_g123456.nb.html) by opening it from your web browser.

Submit your R Notebook file (w5_g123456.nb.html) in Moodle (Week Five Assignment).

Due Sunday 28, January 2024, 11:59 PM

Your Project

Title of your project

The title can be in the title in YAML.

Short Abstract

We study …..

Setup

Install a package countrycode first.

library(tidyverse)
library(WDI)
library(readxl)
library(countrycode)

Importing Data

Viewing Data

Visualization and Analysis

Do not forget to add observations and questions.

About Data

List of Data Chosen:

  1. WIR Executive Report: https://wir2022.wid.world/www-site/uploads/2022/03/WIR2022TablesFigures-Summary.xlsx
  2. The world inequaluty report 2022 Executive Report F4: https://wir2022.wid.world/www-site/uploads/2022/03/WIR2022TablesFigures-Summary.xlsx
  3. WID: World Inequality Database. The data sheet selected was data F4 URL, UN Health Data
  4. UN population: https://data.un.org/_Docs/SYB/CSV/SYB66_246_202310_Population%20Growth,%20Fertility%20and%20Mortality%20Indicators.csv
  5. UN (FAO) palm oil: data attached UNdata_Export_20240128_153052531.csv
  6. UN Human resources in R & D: Link URL https://data.un.org/_Docs/SYB/CSV/SYB66_285_202310_Research%20and%20Development%20Staff%20and%20researchers%20in%20full%20time%20equivalent.csv
  7. UN Consumer Price Index, Employment: https://data.un.org/_Docs/SYB/CSV/SYB66_128_202310_Consumer%20Price%20Index.csv, https://data.un.org/_Docs/SYB/CSV/SYB66_200_202310_Employment.csv
  8. UN Population in the capital city, urban and rural areas: https://data.un.org/_Docs/SYB/CSV/SYB61_253_Population%20Growth%20Rates%20in%20Urban%20areas%20and%20Capital%20cities.csv
  9. UN (UNCHR): total number of forcibly displaced people Link
  10. UN: gender gap in education: https://data.un.org/_Docs/SYB/CSV/SYB66_319_202310_Ratio%20of%20girls%20to%20boys%20in%20education.csv
  11. UN: urbanization (Capital city population (thousands) Urban population (percent growth rate per annum) Rural population (percent growth rate per annum))
  12. UN: Anthracite - commerce and public services
  13. UN Data - Government expenditure on education as % of GDP: Link, UN Data - Gross Enrolment Ratio - Tertiary Education: Link
  14. Ease of doing business (EODB) score Link, CPIA business regulatory environment rating Link
  15. OECD CIP country weight: https://data-explorer.oecd.org/vis?fs[0]=Topic%2C0%7CEconomy%23ECO%23&fs[1]=Topic%2C1%7CEconomy%23ECO%23%7CPrices%23ECO_PRI%23&pg=0&fc=Topic&snb=16&df[ds]=dsDisseminateFinalDMZ&df[id]=DSD_CPI_COU_WEIGHTS%40DF_CPI_CTRY_WEIGHTS&df[ag]=OECD.SDD.TPS&df[vs]=1.0&pd=%2C&dq=.A..&ly[rw]=REF_AREA&ly[cl]=TIME_PERIOD&to[TIME_PERIOD]=false&lo=5&lom=LASTNPERIODS
  16. OECD: Venture capital investments (market statistics), Gross domestic product (GDP)
  17. OECD: https://data-explorer.oecd.org/vis?fs[0]=Topic%2C1%7CSociety%23SOC%23%7CWell-being%20and%20beyond%20GDP%23SOC_WEL%23&pg=0&fc=Topic&bp=true&snb=2&vw=tb&df[ds]=dsDisseminateFinalDMZ&df[id]=DSD_CWB%40DF_CWB&df[ag]=OECD.WISE.CWB&df[vs]=1.0&pd=2018%2C2018&dq=.A4_3%2BA4_2%2BA4_6.A4&ly[cl]=MEASURE&ly[rw]=REF_AREA&to[TIME_PERIOD]=false
  18. OECD: Tertiary graduation rate of women (PhD graduation, women) Link
  19. OECD: Tax on personal income Link
  20. OECD: “ICT Access and Usage by Individuals” URL CSV, “Main Science and Technology Indicators” URL Excel
  21. OECD: fluctuations by analyzing the catch files:
  22. OECD Child Well-Being: Link

Examples

UN Data on Education

Let me illustrate steps using the following indicators. Issues are not taken from the analysis of the one who chose these indicators.

  1. UN Data - Government expenditure on education as % of GDP: Link,

  2. UN Data - Gross Enrollment Ratio - Tertiary Education: Link

When download the data, choose country codes from ‘Select columns’. The first data adds iso3c codes and the second adds UN number codes.

It is helpful to add links to the site.

Set up

library(tidyverse)

Create data folder if you do not have it under Files.

dir.create("data")

If you do not have wdicache.rds in your data folder, run the following two code chunks.

wdicache <- WDIcache()
wdi_country_extra <- wdicache$country |> select(iso3c, region, income, lending)

Information of Data

Importing Data

Go to the data link. Add Reference Area Code from Select column on top. Click Update. You will see that iso3c is added in the first column. Then download a CSV file (Comma). You get ‘UNdata_Export_20240131_024758033.csv’.

Next go the the data link. Similarly, add Country or Area Code from Select column on top. Click Update. You will see that UN code is added in the first column. Then download a CSV file (Comma). You get ‘data/UNdata_Export_20240131_024820801.csv’.

Place the downloaded data ‘UNdata_Export_20240131_024758033.csv’ and ‘UNdata_Export_20240131_024820801.csv’ in the data folder.

df_ed_gov_exp <- read_csv("data/UNdata_Export_20240131_024758033.csv")
Rows: 3195 Columns: 7── Column specification ─────────────────────────────────────────────────────────────────
Delimiter: ","
chr (5): Reference Area Code, Reference Area, Sex, Age group, Units of measurement
dbl (2): Time Period, Observation Value
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_ed_gov_exp
df_ed_gov_exp |> str()
spc_tbl_ [3,195 × 7] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ Reference Area Code : chr [1:3195] "AFG" "AFG" "AFG" "AFG" ...
 $ Reference Area      : chr [1:3195] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
 $ Time Period         : num [1:3195] 2014 2013 2012 2011 2010 ...
 $ Sex                 : chr [1:3195] "Not applicable" "Not applicable" "Not applicable" "Not applicable" ...
 $ Age group           : chr [1:3195] "Not applicable" "Not applicable" "Not applicable" "Not applicable" ...
 $ Units of measurement: chr [1:3195] "Percent" "Percent" "Percent" "Percent" ...
 $ Observation Value   : num [1:3195] 4.8 4.54 3.13 4.09 4.51 ...
 - attr(*, "spec")=
  .. cols(
  ..   `Reference Area Code` = col_character(),
  ..   `Reference Area` = col_character(),
  ..   `Time Period` = col_double(),
  ..   Sex = col_character(),
  ..   `Age group` = col_character(),
  ..   `Units of measurement` = col_character(),
  ..   `Observation Value` = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 

Observation

  • There are seven columns.
  • The first column ‘Reference Area Code’ is ‘iso3c’.
  • The second column ‘Reference Area’ seems to be the country name.
  • The third column ‘Time Period’ is year. It is in dbl, and should be in integer.
  • The fourth column, ‘Sex’ start with “Not applicable”. Probably, male and female will appear.
  • The fifth column, ‘Age group’ start with “Not applicable”.
  • The sixth column, ‘Units of measurement’ starts with “Percent”.
  • The seventh column, ‘Observation Value’ should be numbers reprenting the percent of GDP.

Check the categorical variables

Select the categorical vaiables we want to check the values.

df_ed_gov_exp |> select(`Time Period`, Sex, `Age group`, `Units of measurement`) |> lapply(unique)
$`Time Period`
 [1] 2014 2013 2012 2011 2010 1982 1981 1980 1979 1975 2007 2006 2005 2004 2003 2002 2001
[18] 2000 1999 1998 1997 1996 1995 1994 2008 2009 1987 1986 1985 1990 1989 1984 1983 1978
[35] 1977 1976 1993 1992 1991 1988 2015

$Sex
[1] "Not applicable"

$`Age group`
[1] "Not applicable"

$`Units of measurement`
[1] "Percent"

We do not need the categorical variable with only one value.

With ‘select’ we can change the names of the variables as well. Change Time Period to integer values. Then delete Time Period column. We do not need quotation marks for column names, but if there is a space in the column name, we need to surround by back ticks.

df_gov_exp <- df_ed_gov_exp |> 
  select(iso3c = `Reference Area Code`, country = `Reference Area`, `Time Period`, gov_exp = `Observation Value`) |> mutate(year = as.integer(`Time Period`), .after = country) |> 
  select(-`Time Period`) |> arrange(country, iso3c, year)
df_gov_exp

Now, we reached a clean data. We do the same to the second data.

df_tertiary_ratio <- read_csv("data/UNdata_Export_20240131_024820801.csv")
Warning: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
  dat <- vroom(...)
  problems(dat)Rows: 2066 Columns: 8── Column specification ─────────────────────────────────────────────────────────────────
Delimiter: ","
chr (5): Country or Area, Subgroup, Source, Unit, Value
dbl (3): Country or Area Code, Year, Value Footnotes
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_tertiary_ratio
df_tertiary_ratio |> str()
spc_tbl_ [2,066 × 8] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ Country or Area Code: num [1:2066] 84 84 84 84 149 149 149 149 149 149 ...
 $ Country or Area     : chr [1:2066] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
 $ Subgroup            : chr [1:2066] "Female" "Female" "Male" "Male" ...
 $ Year                : num [1:2066] 2004 2003 2004 2003 2004 ...
 $ Source              : chr [1:2066] "UNESCO_UIS Database_Sep2007" "UNESCO_UIS Database_Sep2007" "UNESCO_UIS Database_Sep2007" "UNESCO_UIS Database_Sep2007" ...
 $ Unit                : chr [1:2066] "Number" "Number" "Number" "Number" ...
 $ Value               : chr [1:2066] "5637" "5344" "22011" "20867" ...
 $ Value Footnotes     : num [1:2066] NA 1 NA NA NA NA NA NA NA NA ...
 - attr(*, "spec")=
  .. cols(
  ..   `Country or Area Code` = col_double(),
  ..   `Country or Area` = col_character(),
  ..   Subgroup = col_character(),
  ..   Year = col_double(),
  ..   Source = col_character(),
  ..   Unit = col_character(),
  ..   Value = col_character(),
  ..   `Value Footnotes` = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 

Besides the ones we noticed in the first data, surprisingly, the Value is in character. Let me check.

df_tertiary_ratio$Value |> unique()
   [1] "5637"     "5344"     "22011"    "20867"    "32897"    "27180"    "26124"   
   [8] "25069"    "24017"    "23032"    "20117"    "16420"    "16036"    "15790"   
  [15] "16108"    "15470"    "429912"   "365409"   "325551"   "351043"   "174"     
  [22] "161"      "149"      "133"      "168"      "170"      "157"      "134"     
  [29] "5009"     "3060"     "7557"     "4785"     "25"       "17"       "12"      
  [36] "…"        "8"        "4"        "0"        "1234534"  "1253534"  "1202086" 
  [43] "1136287"  "1066341"  "987167"   "892579"   "847903"   "824649"   "782421"  
  [50] "700592"   "613715"   "48060"    "44002"    "39544"    "40516"    "37523"   
  [57] "33731"    "32883"    "38569"    "35319"    "34059"    "34958"    "31181"   
  [64] "29063"    "27801"    "1259"     "1026"     "992"      "962"      "986"     
  [71] "957"      "780"      "847"      "678"      "680"      "630"      "642"     
  [78] "621"      "666"      "553069"   "543347"   "544603"   "546544"   "470652"  
  [85] "458538"   "457686"   "461991"   "459651"   "461374"   "465666"   "398037"  
  [92] "386594"   "387950"   "131144"   "127206"   "121778"   "117881"   "137222"  
  [99] "133122"   "126534"   "113266"   "111316"   "108024"   "105854"   "127447"  
 [106] "128107"   "126359"   "60131"    "56431"    "54117"    "53661"    "50203"   
 [113] "46884"    "42066"    "68503"    "66339"    "67039"    "67814"    "70490"   
 [120] "70193"    "65717"    "12781"    "11684"    "11810"    "6630"     "6060"    
 [127] "6840"     "7269"     "4418"     "304935"   "259165"   "280951"   "273799"  
 [134] "297265"   "234797"   "228860"   "606665"   "562199"   "596384"   "581540"  
 [141] "581272"   "491904"   "480364"   "5640"     "5838"     "4786"     "2339"    
 [148] "2236"     "2129"     "299984"   "289517"   "278862"   "263271"   "246071"  
 [155] "231169"   "216261"   "228524"   "217843"   "209788"   "200273"   "191924"  
 [162] "180692"   "171086"   "211974"   "207756"   "199796"   "194843"   "189813"  
 [169] "185908"   "185306"   "177573"   "178354"   "174736"   "172139"   "169452"  
 [176] "169840"   "166482"   "507"      "342"      "215"      "185"      "3920"    
 [183] "3719"     "3346"     "15838"    "15034"    "12938"    "1080"     "1068"    
 [190] "880"      "874"      "639"      "620"      "539"      "1254"     "1217"    
 [197] "940"      "5449"     "4735"     "3754"     "3597"     "2684"     "2436"    
 [204] "5501"     "5462"     "4618"     "4054"     "3648"     "3096"     "2408720" 
 [211] "2254291"  "2022907"  "1753483"  "1562153"  "1365159"  "1866307"  "1740131" 
 [218] "1559198"  "1372262"  "1219175"  "1091802"  "825"      "789"      "735"     
 [225] "523"      "423"      "540"      "598"      "375"      "347"      "290"     
 [232] "235"      "246"      "210"      "258"      "3341"     "3247"     "2941"    
 [239] "2886"     "2830"     "2580"     "2442"     "1682"     "1670"     "1605"    
 [246] "1627"     "1649"     "1404"     "1263"     "123940"   "119890"   "121709"  
 [253] "123261"   "139081"   "149671"   "160614"   "113969"   "108578"   "108804"  
 [260] "105133"   "107925"   "111650"   "109463"   "8587"     "4228"     "4078"    
 [267] "3946"     "3130"     "2251"     "19355"    "14640"    "14122"    "11589"   
 [274] "9192"     "7627"     "4673"     "4353"     "3795"     "3211"     "1712"    
 [281] "1643"     "1488"     "12216"    "11353"    "8120"     "7335"     "4577"    
 [288] "4489"     "3549"     "17875"    "14196"    "12457"    "9228"     "6950"    
 [295] "5547"     "38935"    "31174"    "30753"    "22782"    "18466"    "16561"   
 [302] "39448"    "32541"    "31538"    "30138"    "60416"    "51362"    "49780"   
 [309] "47569"    "748927"   "707689"   "678935"   "683311"   "577784"   "547144"  
 [316] "533226"   "537340"   "1994"     "1597"     "1172"     "924"      "367"     
 [323] "409"      "1916"     "1439"     "1043"     "886"      "351"      "392"     
 [330] "291"      "280"      "99"       "100"      "1027"     "1002"     "5296"    
 [337] "5227"     "1310"     "1262"     "755"      "916"      "885"      "9158"    
 [344] "8819"     "6642"     "5190"     "5016"     "319529"   "278712"   "271278"  
 [351] "247809"   "213254"   "212448"   "344165"   "302103"   "295836"   "273800"  
 [358] "238923"   "238504"   "9944290"  "8512217"  "6657178"  "11391356" "10904827"
 [365] "8529039"  "628006"   "570760"   "508128"   "509251"   "506344"   "481970"  
 [372] "457595"   "595588"   "541814"   "478552"   "480494"   "470899"   "452115"  
 [379] "420349"   "768"      "737"      "299"      "277"      "1011"     "970"     
 [386] "415"      "372"      "1969"     "1923"     "1599"     "3716"     "10487"   
 [393] "10241"    "11804"    "11913"    "8462"     "60144"    "59083"    "41608"   
 [400] "40467"    "41722"    "32923"    "31012"    "50573"    "49682"    "37891"   
 [407] "36816"    "37460"    "28731"    "27749"    "25398"    "71283"    "64749"   
 [414] "59028"    "54637"    "51021"    "50726"    "56973"    "53509"    "49531"   
 [421] "45777"    "45163"    "293089"   "247063"   "132543"   "104036"   "92824"   
 [428] "84826"    "81558"    "178769"   "149453"   "103454"   "87226"    "85197"   
 [435] "73848"    "71905"    "10442"    "9990"     "9044"     "7636"     "6923"    
 [442] "5945"     "6075"     "9636"     "10859"    "6291"     "5011"     "4469"    
 [449] "4767"     "176965"   "163409"   "145451"   "145747"   "130298"   "126289"  
 [456] "114991"   "159342"   "155449"   "141550"   "138738"   "129746"   "127406"  
 [463] "116233"   "133376"   "125628"   "116844"   "112698"   "108290"   "107644"  
 [470] "106957"   "98879"    "91502"    "84902"    "83506"    "83732"    "81518"   
 [477] "83013"    "708"      "508"      "371"      "324"      "207"      "89"      
 [484] "988"      "626"      "535"      "404"      "289"      "101"      "86"      
 [491] "180045"   "175973"   "113520"   "110981"   "66982"    "65451"    "62774"   
 [498] "61449"    "59551"    "62222"    "65299"    "55449"    "54813"    "53747"   
 [505] "51917"    "50395"    "52453"    "53192"    "304"      "699"      "606"     
 [512] "738"      "592"      "4006"     "4987"     "4769"     "3543"     "3454"    
 [519] "41677"    "40558"    "39153"    "37269"    "34719"    "31346"    "28124"   
 [526] "26083"    "25101"    "24472"    "23379"    "23059"    "22267"    "20560"   
 [533] "46574"    "43307"    "37259"    "26898"    "18707"    "14681"    "9769"    
 [540] "144591"   "128804"   "110695"   "74931"    "68724"    "53051"    "42536"   
 [547] "6747"     "6790"     "6798"     "5970"     "5993"     "5981"     "163872"  
 [554] "160104"   "156012"   "153520"   "150585"   "145099"   "141879"   "142124"  
 [561] "139784"   "135652"   "130285"   "129043"   "125086"   "121011"   "1207887" 
 [568] "1189125"  "1166248"  "1111993"  "1099629"  "1092477"  "1095322"  "979496"  
 [575] "971175"   "952901"   "917186"   "932114"   "922867"   "916871"   "2667"    
 [582] "4806"     "293"      "265"      "1237"     "904"      "87836"    "78359"   
 [589] "75834"    "74320"    "68842"    "67418"    "67658"    "86419"    "76699"   
 [596] "79619"    "74822"    "71785"    "69628"    "62506"    "41783"    "22059"   
 [603] "22344"    "18992"    "18282"    "13646"    "77776"    "47909"    "47949"   
 [610] "49397"    "45816"    "41012"    "330440"   "308697"   "286091"   "271230"  
 [617] "244413"   "211087"   "194908"   "316147"   "288310"   "275377"   "258003"  
 [624] "233792"   "211230"   "192951"   "49380"    "48078"    "65384"    "63661"   
 [631] "4435"     "2693"     "2637"     "19353"    "14525"    "14221"    "74"      
 [638] "72"       "78"       "399"      "391"      "421"      "4917"     "4524"    
 [645] "2361"     "2409"     "71999"    "70265"    "64763"    "54212"    "50850"   
 [652] "47373"    "50875"    "49612"    "45726"    "42400"    "39770"    "37627"   
 [659] "77739"    "75662"    "73466"    "74555"    "72062"    "72573"    "254657"  
 [666] "241753"   "221363"   "195854"   "181062"   "165404"   "151471"   "181355"  
 [673] "180424"   "169090"   "158532"   "149487"   "141667"   "127926"   "10020"   
 [680] "9491"     "8497"     "7322"     "6383"     "5985"     "5260"     "5509"    
 [687] "5219"     "4850"     "4262"     "3801"     "3682"     "3202"     "4641576" 
 [694] "4527606"  "4342409"  "4135343"  "3801494"  "3552026"  "7135720"  "7325330" 
 [701] "6952632"  "6441310"  "6032552"  "5852434"  "1595396"  "1556231"  "1511088" 
 [708] "1458354"  "1293089"  "2044874"  "1994861"  "1930341"  "1717479"  "1724798" 
 [715] "1083664"  "1003920"  "869978"   "768433"   "743951"   "635973"   "568092"  
 [722] "1042610"  "951000"   "844455"   "798076"   "825825"   "768907"   "740058"  
 [729] "153711"   "149213"   "108238"   "98306"    "92880"    "271197"   "263332"  
 [736] "209755"   "190364"   "178628"   "102501"   "103941"   "101155"   "97173"   
 [743] "91158"    "86904"    "80900"    "84060"    "84374"    "80402"    "79123"   
 [750] "75442"    "73707"    "70237"    "174092"   "168126"   "167738"   "169338"  
 [757] "153654"   "146626"   "142182"   "136845"   "133101"   "133588"   "130378"  
 [764] "117325"   "109265"   "104624"   "1139807"  "1116589"  "1076253"  "1042977" 
 [771] "1014953"  "982668"   "991450"   "875191"   "869908"   "837099"   "811223"  
 [778] "797372"   "787334"   "805791"   "32003"    "31249"    "28409"    "23408"   
 [785] "13767"    "14145"    "14093"    "12587"    "1853130"  "1848396"  "1815521" 
 [792] "1789881"  "1781996"  "1787068"  "1760494"  "2185172"  "2183208"  "2168879" 
 [799] "2176786"  "2190472"  "2195001"  "2180262"  "109528"   "109692"   "95056"   
 [806] "79582"    "73098"    "108295"   "104414"   "91133"    "83106"    "69092"   
 [813] "437742"   "381704"   "341628"   "287144"   "241722"   "200067"   "172938"  
 [820] "315439"   "282745"   "261444"   "232671"   "203929"   "170254"   "151011"  
 [827] "38584"    "34186"    "32972"    "31266"    "64214"    "63929"    "61657"   
 [834] "57750"    "1188250"  "1178285"  "1168159"  "1127541"  "1070021"  "998297"  
 [841] "923158"   "2036625"  "2045146"  "2041983"  "2002358"  "1933477"  "1839583" 
 [848] "1713230"  "27127"    "23701"    "23955"    "23414"    "22002"    "21867"   
 [855] "11503"    "13165"    "13198"    "13568"    "12777"    "10453"    "121828"  
 [862] "110868"   "108720"   "110875"   "96780"    "80469"    "66619"    "98632"   
 [869] "94356"    "92408"    "98370"    "93728"    "80215"    "64603"    "19523"   
 [876] "12815"    "10053"    "8201"     "6117"     "4798"     "3880"     "27901"   
 [883] "20945"    "18064"    "14817"    "10628"    "9351"     "8196"     "82575"   
 [890] "79473"    "73403"    "67991"    "63524"    "57850"    "50539"    "48131"   
 [897] "48183"    "45541"    "42509"    "39259"    "33387"    "31503"    "87473"   
 [904] "80837"    "77835"    "75687"    "69557"    "60007"    "56850"    "78257"   
 [911] "73798"    "66215"    "67264"    "64461"    "56007"    "56172"    "4503"    
 [918] "3745"     "2905"     "3158"     "2764"     "2579"     "3415"     "2363"    
 [925] "2100"     "1818"     "1706"     "1467"     "18871"    "3987"     "25236"   
 [932] "16817"    "192721"   "184624"   "162833"   "141041"   "149995"   "182307"  
 [939] "174522"   "161770"   "149019"   "158479"   "142"      "119"      "390"     
 [946] "321"      "117493"   "109592"   "100609"   "89947"    "81336"    "73092"   
 [953] "64456"    "77912"    "73064"    "66997"    "58841"    "54587"    "48812"   
 [960] "42963"    "1609"     "1640"     "1566"     "1346"     "1433"     "1437"    
 [967] "1399"     "1187"     "1178"     "1313"     "10019"    "10054"    "9589"    
 [974] "7533"     "6236"     "3883"     "3450"     "13401"    "14761"    "16683"   
 [981] "12887"    "7760"     "3588"     "4008"     "27987"    "26594"    "25621"   
 [988] "24691"    "22463"    "20325"    "19359"    "21377"    "20043"    "20003"   
 [995] "20019"    "17783"    "16597"    "15782"    "21145"    "19945"   
 [ reached getOption("max.print") -- omitted 757 entries ]

We can assume that these are numbers.

df_tertiary_ratio |> select(Subgroup, Year, Source, Unit, `Value Footnotes`) |> lapply(unique)
$Subgroup
[1] "Female" "Male"   NA      

$Year
[1] 2004 2003 2002 2001 2000 1999 2005   NA

$Source
[1] "UNESCO_UIS Database_Sep2007" NA                           

$Unit
[1] "Number" NA      

$`Value Footnotes`
[1] NA  1  2  3  4  5
df_tertiary <- df_tertiary_ratio |> select(un_code = `Country or Area Code`, country = `Country or Area`, sex = Subgroup, Year, tertiary = Value) |> mutate(year = as.integer(Year), .before = sex, tertiary = as.numeric(tertiary)) |> select(-Year)
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `tertiary = as.numeric(tertiary)`.
Caused by warning:
! NAs introduced by coercion
df_tertiary

Here, we check the list of countries in two data sets.

setdiff(unique(df_gov_exp$country), unique(df_tertiary$country))
 [1] "Bolivia"                                             
 [2] "Brunei Darussalam"                                   
 [3] "Côte d'Ivoire"                                       
 [4] "Democratic Republic of the Congo"                    
 [5] "Ecuador"                                             
 [6] "Egypt"                                               
 [7] "Gambia"                                              
 [8] "Germany"                                             
 [9] "Haiti"                                               
[10] "Holy See"                                            
[11] "Hong Kong Special Administrative Region of China"    
[12] "Iran, Islamic Republic of"                           
[13] "Lao People's Democratic Republic"                    
[14] "Libyan Arab Jamahiriya"                              
[15] "Macao Special Administrative Region of China"        
[16] "Micronesia, Federated States of"                     
[17] "Moldova"                                             
[18] "Puerto Rico"                                         
[19] "Republic of Korea"                                   
[20] "Saint Vincent and the Grenadines"                    
[21] "Senegal"                                             
[22] "Serbia"                                              
[23] "Singapore"                                           
[24] "South Sudan"                                         
[25] "Sri Lanka"                                           
[26] "Syrian Arab Republic"                                
[27] "The former Yugoslav Republic of Macedonia"           
[28] "Timor-Leste"                                         
[29] "Turkmenistan"                                        
[30] "United Kingdom of Great Britain and Northern Ireland"
[31] "United Republic of Tanzania"                         
[32] "Venezuela (Bolivarian Republic of)"                  
[33] "Viet Nam"                                            
setdiff(unique(df_tertiary$country), unique(df_gov_exp$country))
 [1] "Brunei"                                "Cayman Islands"                       
 [3] "Côte d’Ivoire"                         "Gambia The"                           
 [5] "Gibraltar"                             "Hong Kong SAR"                        
 [7] "Iran"                                  "Korea Rep"                            
 [9] "Lao PDR"                               "Libya"                                
[11] "Macau SAR"                             "Macedonia"                            
[13] "Nauru"                                 "Netherlands Antilles"                 
[15] "Niue"                                  "Palestinian Territory, Occupied"      
[17] "Republic of Moldova"                   "Serbia and Montenegro"                
[19] "St Vincent and the Grenadines"         "Suriname"                             
[21] "Tanzania"                              "Timor Leste"                          
[23] "Tokelau"                               "United Kingdom"                       
[25] "Uzbekistan"                            "Venezuela"                            
[27] "Vietnam"                               "Footnote"                             
[29] "UIS estimation."                       "National Estimation."                 
[31] "Figure based on: National estimation." "Category not applicable."             
[33] "Figure based on: UIS estimation."     

We can observe that many country names do not agree.

Country Names are different.

Next check, if we can properly assign iso3c to the second data. The following shows that excep the 8 countries below, iso3c are assigned.

df_tertiary |> 
  mutate(iso3c = countrycode(country, "country.name", "iso3c"), .after = un_code) |> 
  filter(is.na(iso3c)) |> distinct(country)
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `iso3c = countrycode(country, "country.name", "iso3c")`.
Caused by warning:
! Some values were not matched unambiguously: Category not applicable., Figure based on: National estimation., Figure based on: UIS estimation., Footnote, National Estimation., Netherlands Antilles, Serbia and Montenegro, UIS estimation.

Check whether two countries appear in the first data.

df_gov_exp |> filter(country %in% c("Netherlands Antilles", "Serbia and Montenegro"))

Let us assign iso3c and delete the rows which we cannot assign iso3c.

df_tertiary1 <- df_tertiary |> 
  mutate(iso3c = countrycode(country, "country.name", "iso3c"), .after = un_code) |> 
  select(-country, -un_code) |> filter(!is.na(iso3c))
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `iso3c = countrycode(country, "country.name", "iso3c")`.
Caused by warning:
! Some values were not matched unambiguously: Category not applicable., Figure based on: National estimation., Figure based on: UIS estimation., Footnote, National Estimation., Netherlands Antilles, Serbia and Montenegro, UIS estimation.
df_tertiary1

Now we combine these two datasets. We reached a reasonably clean combined dataset.

df_un_ed_combined <- df_gov_exp |> full_join(df_tertiary1, by = c("iso3c", "year"))
df_un_ed_combined

Five chosen counries’ government expendicure on education

df_un_ed_combined |> filter(country %in% c("Japan", "Viet Nam", "China", "Republic of Korea", "United States of America")) |> drop_na(gov_exp) |>
  ggplot(aes(year, gov_exp, col = country)) + geom_line() +
  labs(title = "Five Countries' Goverment Expenditure on Education")

df_un_ed_combined |> filter(country %in% c("Japan", "Viet Nam", "China", "Republic of Korea", "United States of America")) |> drop_na(tertiary)

Five counrties’ tertiary educaton enrolement

df_un_ed_combined |> filter(country %in% c("Japan", "Viet Nam", "China", "Republic of Korea", "United States of America")) |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary, col = country, linetype = sex)) + geom_line()

df_un_ed_combined |> filter(country %in% c("Japan", "Viet Nam", "China", "Republic of Korea", "United States of America")) |> drop_na(tertiary) |>
  ggplot(aes(year, tertiary, col = country, linetype = sex)) + geom_line() + 
  scale_y_log10() + labs(title = "Gross Enrolment Ratio in Tertiary Education", subtitle = "Log 10 Scale in Number")

Combine wdicache

df_un_ed_combined_ext <- df_un_ed_combined |> left_join(wdi_country_extra, by = 'iso3c')
df_un_ed_combined_ext

Human resources in Research and Development

Preparation

wdicache <- read_rds("data/wdicache.rds")
wdi_country_extra <- wdicache$country |> select(iso2c, region, income)
INCOME <- c("High income", "Upper middle income", "Lower middle income", "Low income")
BRICS <- c("Brazil", "Russian Federation", "India", "China", "South Africa")
G7 <- c("Canada", "France", "Germany", "Italy", "Japan", "United Kingdom", "United States")

Importing Data

url_un_R_D <- "https://data.un.org/_Docs/SYB/CSV/SYB66_285_202310_Research%20and%20Development%20Staff%20and%20researchers%20in%20full%20time%20equivalent.csv"
df_un_R_D <- read_csv(url_un_R_D, skip = 1)
New names:Rows: 983 Columns: 7── Column specification ─────────────────────────────────────────────────────────────────
Delimiter: ","
chr (4): ...2, Series, Footnotes, Source
dbl (2): Region/Country/Area, Year
num (1): Value
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_un_R_D
str(df_un_R_D)
spc_tbl_ [983 × 7] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ Region/Country/Area: num [1:983] 1 1 1 1 1 1 1 1 15 15 ...
 $ ...2               : chr [1:983] "Total, all countries or areas" "Total, all countries or areas" "Total, all countries or areas" "Total, all countries or areas" ...
 $ Year               : num [1:983] 2005 2005 2010 2010 2015 ...
 $ Series             : chr [1:983] "Gross domestic expenditure on R&D: as a percentage of GDP" "Researchers per million inhabitants (FTE)" "Gross domestic expenditure on R&D: as a percentage of GDP" "Researchers per million inhabitants (FTE)" ...
 $ Value              : num [1:983] 1.5 907.2 1.6 1022.1 1.7 ...
 $ Footnotes          : chr [1:983] NA NA NA NA ...
 $ Source             : chr [1:983] "United Nations Educational, Scientific and Cultural Organization (UNESCO), Montreal, the UNESCO Institute for S"| __truncated__ "United Nations Educational, Scientific and Cultural Organization (UNESCO), Montreal, the UNESCO Institute for S"| __truncated__ "United Nations Educational, Scientific and Cultural Organization (UNESCO), Montreal, the UNESCO Institute for S"| __truncated__ "United Nations Educational, Scientific and Cultural Organization (UNESCO), Montreal, the UNESCO Institute for S"| __truncated__ ...
 - attr(*, "spec")=
  .. cols(
  ..   `Region/Country/Area` = col_double(),
  ..   ...2 = col_character(),
  ..   Year = col_double(),
  ..   Series = col_character(),
  ..   Value = col_number(),
  ..   Footnotes = col_character(),
  ..   Source = col_character()
  .. )
 - attr(*, "problems")=<externalptr> 
df_un_R_D |> select(Series, Footnotes, Source) |> lapply(unique)
$Series
[1] "Gross domestic expenditure on R&D: as a percentage of GDP"
[2] "Researchers per million inhabitants (FTE)"                

$Footnotes
 [1] NA                                                                                                                                                                                                                
 [2] "Partial data."                                                                                                                                                                                                   
 [3] "Break in the time series."                                                                                                                                                                                       
 [4] "Partial data.;Excluding private non-profit.;Excluding business enterprise."                                                                                                                                      
 [5] "Excluding private non-profit.;Excluding business enterprise."                                                                                                                                                    
 [6] "Estimate."                                                                                                                                                                                                       
 [7] "Estimate.;Estimate."                                                                                                                                                                                             
 [8] "Data have been converted from the former national currency using the appropriate conversion rate."                                                                                                               
 [9] "Overestimated or based on overestimated data.;Excluding most or all capital expenditures."                                                                                                                       
[10] "Overestimated or based on overestimated data."                                                                                                                                                                   
[11] "Break in the time series.;Higher Education only."                                                                                                                                                                
[12] "Break in the time series.;Excluding business enterprise."                                                                                                                                                        
[13] "Break in the time series.;Partial data."                                                                                                                                                                         
[14] "Partial data.;Higher Education only."                                                                                                                                                                            
[15] "For statistical purposes, the data for China do not include those for the Hong Kong Special Administrative Region (Hong Kong SAR), Macao Special Administrative Region (Macao SAR) and Taiwan Province of China."
[16] "Estimate.;Partial data."                                                                                                                                                                                         
[17] "Partial data.;Excluding business enterprise."                                                                                                                                                                    
[18] "Break in the time series.;Excluding business enterprise.;Overestimated or based on overestimated data."                                                                                                          
[19] "Government only.;S&T budget instead of R&D expenditure."                                                                                                                                                         
[20] "Partial data.;Government only."                                                                                                                                                                                  
[21] "Break in the time series.;Partial data.;Excluding higher education and private non-profit."                                                                                                                      
[22] "Estimate.;Break in the time series.;Partial data."                                                                                                                                                               
[23] "Excluding private non-profit.;Excluding government."                                                                                                                                                             
[24] "Excluding private non-profit.;Excluding business enterprise.;Based on R&D budget instead of R&D expenditure."                                                                                                    
[25] "Do not correspond exactly to Frascati Manual recommendations."                                                                                                                                                   
[26] "Break in the time series.;Overestimated or based on overestimated data."                                                                                                                                         
[27] "Break in the time series.;Partial data.;Excluding private non-profit.;Excluding business enterprise."                                                                                                            
[28] "Government only."                                                                                                                                                                                                
[29] "Excluding private non-profit."                                                                                                                                                                                   
[30] "Break in the time series.;Partial data.;Government only."                                                                                                                                                        
[31] "Excluding business enterprise."                                                                                                                                                                                  
[32] "Overestimated or based on overestimated data.;Based on R&D budget instead of R&D expenditure."                                                                                                                   
[33] "Partial data.;Excluding government."                                                                                                                                                                             
[34] "Partial data.;Based on R&D budget instead of R&D expenditure."                                                                                                                                                   
[35] "Higher Education only."                                                                                                                                                                                          
[36] "Overestimated. Based on R&D budget instead of R&D expenditure."                                                                                                                                                  
[37] "Do not correspond exactly to Frascati Manual recommendations.;Excluding data from some regions, provinces or states."                                                                                            
[38] "Excluding data from some regions, provinces or states."                                                                                                                                                          
[39] "Estimate.;Overestimated or based on overestimated data."                                                                                                                                                         
[40] "The sum of the breakdown does not add to the total."                                                                                                                                                             
[41] "Estimate.;Break in the time series.;Excluding data from some regions, provinces or states."                                                                                                                      
[42] "Break in the time series.;Do not correspond exactly to Frascati Manual recommendations."                                                                                                                         

$Source
[1] "United Nations Educational, Scientific and Cultural Organization (UNESCO), Montreal, the UNESCO Institute for Statistics (UIS) statistics database, last accessed April 2023."

Transforming Data

Add iso2c code, and check those the names listed in …2 whose iso2c_un is NA. From the output, these are all region names. So in the next code, we delete them.

library(countrycode)
df_un_R_D_region <- df_un_R_D |> 
  mutate(iso2c = countrycode(`Region/Country/Area`, "un", "iso2c"), .after = ...2) |>
  filter(is.na(iso2c)) 
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `iso2c = countrycode(`Region/Country/Area`, "un", "iso2c")`.
Caused by warning:
! Some values were not matched unambiguously: 1, 9, 15, 21, 30, 34, 35, 53, 62, 143, 145, 150, 199, 202, 419, 432, 722
df_un_R_D_region |> distinct(...2)
df_un_R_D |> 
  mutate(iso2c = countrycode(`Region/Country/Area`, "un", "iso2c"), .after = ...2) |>
  filter(!is.na(iso2c)) |> 
  select(country = ...2, iso2c, year = Year, series = Series, value = Value) |>
  pivot_wider(names_from = series, values_from = value)
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `iso2c = countrycode(`Region/Country/Area`, "un", "iso2c")`.
Caused by warning:
! Some values were not matched unambiguously: 1, 9, 15, 21, 30, 34, 35, 53, 62, 143, 145, 150, 199, 202, 419, 432, 722

The following is another way of renaming series names, an alternative to use mutate-case_when. The operation pivot_wider is the converse operation to pivot_longer.

The units of two indicators are different. One is in percent of GDP, and the other is the number of researchers in one million inhabitants. So it is better to handle the data in wide format instead of that in long data.

df_R_D_wide <- df_un_R_D |> 
  mutate(iso2c = countrycode(`Region/Country/Area`, "un", "iso2c"), .after = ...2) |>
  filter(!is.na(iso2c)) |> 
  select(country = ...2, iso2c, year = Year, series = Series, value = Value) |>
  pivot_wider(names_from = series, values_from = value) |>
  rename(rd_exp = `Gross domestic expenditure on R&D: as a percentage of GDP`, researcher = `Researchers per million inhabitants (FTE)`)
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `iso2c = countrycode(`Region/Country/Area`, "un", "iso2c")`.
Caused by warning:
! Some values were not matched unambiguously: 1, 9, 15, 21, 30, 34, 35, 53, 62, 143, 145, 150, 199, 202, 419, 432, 722
df_R_D_wide
df_R_D_region_wide <- df_un_R_D_region |> select(country = ...2, year = Year, series = Series, value = Value) |>
  pivot_wider(names_from = series, values_from = value) |>
  rename(rd_exp = `Gross domestic expenditure on R&D: as a percentage of GDP`, researcher = `Researchers per million inhabitants (FTE)`)
df_R_D_region_wide
df_R_D_wide_extra <- df_R_D_wide |> left_join(wdi_country_extra, by = "iso2c")
df_R_D_wide_extra
df_R_D_extra <- df_R_D_wide_extra |> pivot_longer(cols = c(rd_exp, researcher))
df_R_D_extra

Visualization

Bar Chart

It is important to check the number of data in each year.

df_R_D_extra |> drop_na(value) |> 
  ggplot(aes(year, fill = name)) + geom_bar() + labs(title = "Count of data")

Scatter Plot

df_R_D_wide_extra |> drop_na(rd_exp, researcher) |>
  ggplot(aes(rd_exp, researcher, col = income)) + geom_point() +
  labs(title = "Scatterplot: Expenditure on R&D vs Researchers per million", subtitle = "by income level")

df_R_D_wide_extra |> drop_na(rd_exp, researcher) |>
  ggplot(aes(rd_exp, researcher, col = region)) + geom_point() +
  labs(title = "Scatterplot: Expenditure on R&D vs Researchers per million", subtitle = "by region")

df_R_D_wide_extra |> drop_na(rd_exp, researcher) |> lm(researcher ~ rd_exp, data = _) |>
  summary()

Call:
lm(formula = researcher ~ rd_exp, data = drop_na(df_R_D_wide_extra, 
    rd_exp, researcher))

Residuals:
    Min      1Q  Median      3Q     Max 
-3251.5  -498.3  -112.3   360.5  3450.0 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)    39.11      72.54   0.539     0.59    
rd_exp       1998.86      53.60  37.289   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 951.9 on 354 degrees of freedom
Multiple R-squared:  0.7971,    Adjusted R-squared:  0.7965 
F-statistic:  1390 on 1 and 354 DF,  p-value: < 2.2e-16
df_R_D_wide_extra |> drop_na(rd_exp, researcher) |> select(rd_exp, researcher) |> cor()
              rd_exp researcher
rd_exp     1.0000000  0.8927913
researcher 0.8927913  1.0000000

The value is the square root of the multiple R-squared above. There variables are strongly positively correlated.

Boxplot

df_R_D_wide_extra |> filter(year %in% c(2005, 2010, 2015, 2020)) |> drop_na(rd_exp) |>
  filter(income %in% INCOME) |>
  ggplot(aes(factor(income, levels = INCOME), rd_exp)) + geom_boxplot() + 
  labs(title = "Gross domestic expenditure on R&D: % of GDP by income level", x = "", y = "expenditure on R&D" )

df_R_D_wide_extra |> filter(year %in% c(2005, 2010, 2015, 2020)) |> drop_na(researcher) |>
  filter(income %in% INCOME) |>
  ggplot(aes(factor(income, levels = INCOME), researcher)) + geom_boxplot() + 
  labs(title = "Researchers per million inhabitants (FTE) by income level", x = "")

df_R_D_wide_extra |> filter(year %in% c(2005, 2010, 2015, 2020)) |> drop_na(rd_exp) |>
  ggplot(aes(region, rd_exp)) + geom_boxplot() + coord_flip() + 
  labs(title = "Gross domestic expenditure on R&D: % of GDP ", x = "", y = "expenditure on R&D")

df_R_D_wide_extra |> filter(year %in% c(2005, 2010, 2015, 2020)) |> drop_na(researcher) |>
  ggplot(aes(region, researcher)) + geom_boxplot() + coord_flip() + 
  labs(title = "Researchers per million inhabitants (FTE) by region", x = "")

The variable year is in integers which is a numerical variable. So in order to take it as a categorical variable, we use factor(year).

df_R_D_wide_extra |> filter(year %in% c(2005, 2010, 2015, 2020)) |> drop_na(rd_exp) |>
  ggplot(aes(factor(year), rd_exp)) + geom_boxplot() + 
  labs(title = "Gross domestic expenditure on R&D: % of GDP ", x = "year", y = "expenditure on R&D")

df_R_D_wide_extra |> filter(year %in% c(2005, 2010, 2015, 2020)) |> drop_na(researcher) |>
  ggplot(aes(factor(year), researcher)) + geom_boxplot() + 
  labs(title = "Researchers per million inhabitants (FTE) by year", x = "year", y = "expenditure on R&D")

Line Chart

df_R_D_wide_extra |> filter(country %in% G7) |> drop_na(rd_exp) |>
  ggplot(aes(year, rd_exp, col = country)) + geom_line() + 
  labs(title = "G7 countries: Gross domestic expenditure on R&D: % of GDP ", y = "expenditure on R&D")

df_R_D_wide_extra |> filter(country %in% BRICS) |> drop_na(rd_exp) |>
  ggplot(aes(year, rd_exp, col = country)) + geom_line() + 
  labs(title = "BRICS countries: Gross domestic expenditure on R&D: % of GDP ",y = "expenditure on R&D")

df_R_D_wide_extra |> filter(country %in% G7) |> drop_na(researcher) |>
  ggplot(aes(year, researcher, col = country)) + geom_line()  + 
  labs(title = "G7 countries: Researchers per million inhabitants (FTE)")

df_R_D_wide_extra |> filter(country %in% BRICS) |> drop_na(researcher) |>
  ggplot(aes(year, researcher, col = country)) + geom_line() + 
  labs(title = "BRICS countries: Researchers per million inhabitants (FTE)")

df_R_D_region_wide |> distinct(country)
df_R_D_region_wide |> drop_na(rd_exp) |>
  filter(!(country %in% c("Total, all countries or areas", "Australia and New Zealand", "LLDCs", "LDC\xa7", "SIDS"))) |> ggplot(aes(year, rd_exp, col = country)) + geom_line() +
  labs(title = "Gross domestic expenditure on R&D: % of GDP by region")

df_R_D_region_wide |> drop_na(researcher) |>
  filter(!(country %in% c("Total, all countries or areas", "Australia and New Zealand", "LLDCs", "LDC\xa7", "SIDS"))) |> ggplot(aes(year, researcher, col = country)) + geom_line() +
  labs(title = "Researchers per million inhabitants (FTE) by region")

Column Chart

rd_exp_ranking <- df_R_D_region_wide |> filter(year == 2015) |> 
  filter(!(country %in% c("Total, all countries or areas", "Australia and New Zealand", "LLDCs", "LDC\xa7", "SIDS"))) |> drop_na(rd_exp) |> arrange(rd_exp) |> pull(country)
rd_exp_ranking
 [1] "Central Asia"                  "Sub-Saharan Africa"           
 [3] "Northern Africa"               "Southern Asia"                
 [5] "Latin America & the Caribbean" "Western Asia"                 
 [7] "South-eastern Asia"            "Europe"                       
 [9] "Oceania"                       "Eastern Asia"                 
[11] "Northern America"             
df_R_D_region_wide |> filter(year == 2015) |> 
  filter(!(country %in% c("Total, all countries or areas", "Australia and New Zealand", "LLDCs", "LDC\xa7", "SIDS"))) |> drop_na(rd_exp) |>
  ggplot(aes(factor(country, levels = rd_exp_ranking), rd_exp)) + geom_col() + coord_flip() + 
  labs(title="Gross domestic expenditure on R&D: % of GDP by region in 2015", x = "", y = "")

researcher_ranking <- df_R_D_region_wide |> filter(year == 2015) |> 
  filter(!(country %in% c("Total, all countries or areas", "Australia and New Zealand", "LLDCs", "LDC\xa7", "SIDS"))) |> drop_na(researcher) |> arrange(researcher) |> pull(country)
researcher_ranking
 [1] "Sub-Saharan Africa"            "Southern Asia"                
 [3] "South-central Asia"            "Central Asia"                 
 [5] "Latin America & the Caribbean" "South-eastern Asia"           
 [7] "Northern Africa"               "Western Asia"                 
 [9] "Eastern Asia"                  "Europe"                       
[11] "Oceania"                       "Northern America"             
df_R_D_region_wide |> filter(year == 2015) |> 
  filter(!(country %in% c("Total, all countries or areas", "Australia and New Zealand", "LLDCs", "LDC\xa7", "SIDS"))) |> drop_na(researcher) |>
  ggplot(aes(factor(country, levels = researcher_ranking), researcher, fill= factor(country, levels = researcher_ranking))) + geom_col() + coord_flip() + 
  labs(title="Researchers per million inhabitants (FTE) by region in 2015", x = "", y = "") + theme(legend.position = "none")

df_R_D_region_wide |> drop_na(researcher) |>
  filter(!(country %in% c("Total, all countries or areas", "Australia and New Zealand", "LLDCs", "LDC\xa7", "SIDS"))) |> ggplot(aes(year, researcher, col = country)) + geom_line() +
  labs(title = "Researchers per million inhabitants (FTE) by region")

Reference

The R Notebook contains various technique on visualization. Link I recommend rnaturalearth and rnaturalearthdata packages introduced in class for choropleth maps.

LS0tCnRpdGxlOiAiUmVzcG9uc2VzIHRvIFdlZWsgRml2ZSBBc3NpZ25tZW50IgphdXRob3I6ICJIaXJvc2hpIFN1enVraSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKLS0tCgojIEFzc2lnbm1lbnQKCiMjIFdlZWsgRml2ZSBBc3NpZ25tZW50CgpDaG9vc2UgYSBkYXRhIGZyb20gVU4gZGF0YSBvciBPRUNEIGRhdGEuCgotICAgQ3JlYXRlIGFuIFIgTm90ZWJvb2sgb2YgYSBkYXRhIGFuYWx5c2lzIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBhbmQgc3VibWl0IHRoZSByZW5kZXJlZCBmaWxlIChlLmcuLMKgYHc1X2cxMjM0NTYubmIuaHRtbGApIGluIE1vb2RsZS4KCiAgICAxLiAgQ3JlYXRlIGFuIFIgTm90ZWJvb2sgdXNpbmcgdGhlIFIgTm90ZWJvb2sgVGVtcGxhdGUgaW4gTW9vZGxlIGFuZCBzYXZlIGl0IGFzLMKgZm9yIGV4YW1wbGUsIGB3NV9nMTIzNDU2LlJtZGAuCgogICAgMi4gIEVkaXQgYXV0aG9yIHdpdGggbmFtZSwgSUQsIGFuZCB0aXRsZS4KCi0gICBDb250ZW50cyBzaG91bGQgaW5jbHVkZSB0aGUgZm9sbG93aW5nOgoKICAgIC0gICBBIHNob3J0IGFic3RyYWN0CgogICAgLSAgIEluZm9ybWF0aW9uIG9mIGRhdGEgaW5jbHVkaW5nIGRhdGEgbmFtZSwgZGVzY3JpcHRpb24gYW5kIGxpbmsgdG8gcmVhY2ggdGhlIGRhdGEKCiAgICAtICAgU2V2ZXJhbCBjaGFydHM6IGEgYmFyIGdyYXBoIG9yIGEgY29sdW1uIGdyYXBoLCBhIGhpc3RvZ3JhbSwgYSBsaW5lIGdyYXBoLCBhIHNjYXR0ZXIgcGxvdAoKICAgIC0gICBPYnNlcnZhdGlvbnMgb3IgcXVlc3Rpb25zIGZvciB2aXN1YWxpemF0aW9ucwoKLSAgIFVzZSBsZWZ0X2pvaW4sIGlmIHBvc3NpYmxlLiAoYSBjaGFsbGVuZ2UsIG5vdCByZXF1aXJlZCkKCi0gICBSdW4gZWFjaCBjb2RlIGJsb2NrIGFuZCBwcmV2aWV3IHRvIGNyZWF0ZSwgZm9yIGV4YW1wbGUswqBgdzVfZzEyMzQ1Ni5uYi5odG1sYC4KCiAgICAtICAgT3IsIFJ1biBBbGwgdW5kZXIgUnVuIGFuZCBQcmV2aWV3IHRvIGNoZWNrIGluIHlvdXIgd2ViIGJyb3dzZXIhCgogICAgLSAgIFlvdSBjYW4gYWxzbyB2aWV3IHlvdXIgZmlsZSAoZS5nLiBgdzVfZzEyMzQ1Ni5uYi5odG1sYCkgYnkgb3BlbmluZyBpdCBmcm9tIHlvdXIgd2ViIGJyb3dzZXIuCgpTdWJtaXQgeW91ciBSIE5vdGVib29rIGZpbGUgKHc1X2cxMjM0NTYubmIuaHRtbCkgaW4gTW9vZGxlIChXZWVrIEZpdmUgQXNzaWdubWVudCkuCgoqKipEdWUgU3VuZGF5IDI4LCBKYW51YXJ5IDIwMjQsIDExOjU5IFBNKioqCgojIFlvdXIgUHJvamVjdAoKIyMgVGl0bGUgb2YgeW91ciBwcm9qZWN0CgoqVGhlIHRpdGxlIGNhbiBiZSBpbiB0aGUgdGl0bGUgaW4gWUFNTC4qCgojIyMgU2hvcnQgQWJzdHJhY3QKCldlIHN0dWR5IC4uLi4uCgojIyMgU2V0dXAKCkluc3RhbGwgYSBwYWNrYWdlIGBjb3VudHJ5Y29kZWAgZmlyc3QuCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShjb3VudHJ5Y29kZSkKYGBgCgoKIyMjIEltcG9ydGluZyBEYXRhCgojIyMgVmlld2luZyBEYXRhCgojIyMgVmlzdWFsaXphdGlvbiBhbmQgQW5hbHlzaXMKCipEbyBub3QgZm9yZ2V0IHRvIGFkZCBvYnNlcnZhdGlvbnMgYW5kIHF1ZXN0aW9ucy4qCgoKIyMgQWJvdXQgRGF0YQoKIyMjIExpc3Qgb2YgRGF0YSBDaG9zZW46CgoxLiBXSVIgRXhlY3V0aXZlIFJlcG9ydDogaHR0cHM6Ly93aXIyMDIyLndpZC53b3JsZC93d3ctc2l0ZS91cGxvYWRzLzIwMjIvMDMvV0lSMjAyMlRhYmxlc0ZpZ3VyZXMtU3VtbWFyeS54bHN4CjIuIFRoZSB3b3JsZCBpbmVxdWFsdXR5IHJlcG9ydCAyMDIyIEV4ZWN1dGl2ZSBSZXBvcnQgRjQ6IGh0dHBzOi8vd2lyMjAyMi53aWQud29ybGQvd3d3LXNpdGUvdXBsb2Fkcy8yMDIyLzAzL1dJUjIwMjJUYWJsZXNGaWd1cmVzLVN1bW1hcnkueGxzeAozLiBXSUQ6IFdvcmxkIEluZXF1YWxpdHkgRGF0YWJhc2UuIFRoZSBkYXRhIHNoZWV0IHNlbGVjdGVkIHdhcyBkYXRhIEY0IFtVUkxdKGh0dHBzOi8vd2lyMjAyMi53aWQud29ybGQvd3d3LXNpdGUvdXBsb2Fkcy8yMDIyLzAzL1dJUjIwMjJUYWJsZXNGaWd1cmVzLVN1bW1hcnkueGxzeCksIFVOIEhlYWx0aCBEYXRhCjQuICBVTiBwb3B1bGF0aW9uOiBodHRwczovL2RhdGEudW4ub3JnL19Eb2NzL1NZQi9DU1YvU1lCNjZfMjQ2XzIwMjMxMF9Qb3B1bGF0aW9uJTIwR3Jvd3RoLCUyMEZlcnRpbGl0eSUyMGFuZCUyME1vcnRhbGl0eSUyMEluZGljYXRvcnMuY3N2CjUuICBVTiAoRkFPKSBwYWxtIG9pbDogZGF0YSBhdHRhY2hlZCBVTmRhdGFfRXhwb3J0XzIwMjQwMTI4XzE1MzA1MjUzMS5jc3YKNi4gIFVOIEh1bWFuIHJlc291cmNlcyBpbiBSICYgRDogW0xpbmtdKGh0dHBzOi8vZGF0YS51bi5vcmcvX0RvY3MvU1lCL0NTVi9TWUI2Nl8yODVfMjAyMzEwX1Jlc2VhcmNoJTIwYW5kJTIwRGV2ZWxvcG1lbnQlMjBTdGFmZiUyMGFuZCUyMHJlc2VhcmNoZXJzJTIwaW4lMjBmdWxsJTIwdGltZSUyMGVxdWl2YWxlbnQuY3N2KSBVUkwgaHR0cHM6Ly9kYXRhLnVuLm9yZy9fRG9jcy9TWUIvQ1NWL1NZQjY2XzI4NV8yMDIzMTBfUmVzZWFyY2glMjBhbmQlMjBEZXZlbG9wbWVudCUyMFN0YWZmJTIwYW5kJTIwcmVzZWFyY2hlcnMlMjBpbiUyMGZ1bGwlMjB0aW1lJTIwZXF1aXZhbGVudC5jc3YKNy4gIFVOIENvbnN1bWVyIFByaWNlIEluZGV4LCBFbXBsb3ltZW50OiBodHRwczovL2RhdGEudW4ub3JnL19Eb2NzL1NZQi9DU1YvU1lCNjZfMTI4XzIwMjMxMF9Db25zdW1lciUyMFByaWNlJTIwSW5kZXguY3N2LCBodHRwczovL2RhdGEudW4ub3JnL19Eb2NzL1NZQi9DU1YvU1lCNjZfMjAwXzIwMjMxMF9FbXBsb3ltZW50LmNzdgo4LiAgVU4gUG9wdWxhdGlvbiBpbiB0aGUgY2FwaXRhbCBjaXR5LCB1cmJhbiBhbmQgcnVyYWwgYXJlYXM6IGh0dHBzOi8vZGF0YS51bi5vcmcvX0RvY3MvU1lCL0NTVi9TWUI2MV8yNTNfUG9wdWxhdGlvbiUyMEdyb3d0aCUyMFJhdGVzJTIwaW4lMjBVcmJhbiUyMGFyZWFzJTIwYW5kJTIwQ2FwaXRhbCUyMGNpdGllcy5jc3YKOS4gIFVOIChVTkNIUik6IHRvdGFsIG51bWJlciBvZiBmb3JjaWJseSBkaXNwbGFjZWQgcGVvcGxlIFtMaW5rXShodHRwczovL2RhdGEudW4ub3JnL0RhdGEuYXNweD9kPVVOSENSJmY9aW5kSUQlM2FUeXBlLVJlZikKMTAuIFVOOiBnZW5kZXIgZ2FwIGluIGVkdWNhdGlvbjogIGh0dHBzOi8vZGF0YS51bi5vcmcvX0RvY3MvU1lCL0NTVi9TWUI2Nl8zMTlfMjAyMzEwX1JhdGlvJTIwb2YlMjBnaXJscyUyMHRvJTIwYm95cyUyMGluJTIwZWR1Y2F0aW9uLmNzdgoxMS4gVU46IHVyYmFuaXphdGlvbiAoQ2FwaXRhbCBjaXR5IHBvcHVsYXRpb24gKHRob3VzYW5kcykKVXJiYW4gcG9wdWxhdGlvbiAocGVyY2VudCBncm93dGggcmF0ZSBwZXIgYW5udW0pClJ1cmFsIHBvcHVsYXRpb24gKHBlcmNlbnQgZ3Jvd3RoIHJhdGUgcGVyIGFubnVtKSkKMTIuIFVOOiBBbnRocmFjaXRlIC0gY29tbWVyY2UgYW5kIHB1YmxpYyBzZXJ2aWNlcwoxMy4gVU4gRGF0YSAtIEdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzICUgb2YgR0RQOiBbTGlua10oaHR0cHM6Ly9kYXRhLnVuLm9yZy9EYXRhLmFzcHg/cT1lZHVjYXRpb24rZXhwZW5kaXR1cmUmZD1VTkVTQ08mZj1zZXJpZXMlM2FYR0RQX0ZTR09WKSwgVU4gRGF0YSAtIEdyb3NzIEVucm9sbWVudCBSYXRpbyAtIFRlcnRpYXJ5IEVkdWNhdGlvbjogW0xpbmtdKGh0dHBzOi8vZGF0YS51bi5vcmcvRGF0YS5hc3B4P3E9dGVydGlhcnkmZD1HZW5kZXJTdGF0JmY9aW5JRCUzYTY1KQoxNC4gRWFzZSBvZiBkb2luZyBidXNpbmVzcyAoRU9EQikgc2NvcmUgW0xpbmtdKCBodHRwczovL2RhdGEudW4ub3JnL0RhdGEuYXNweD9kPVdESSZmPUluZGljYXRvcl9Db2RlJTNhSUMuQlVTLkRGUk4uWFEpLCBDUElBIGJ1c2luZXNzIHJlZ3VsYXRvcnkgZW52aXJvbm1lbnQgcmF0aW5nIFtMaW5rXShodHRwczovL2RhdGEudW4ub3JnL0RhdGEuYXNweD9xPWNwaWEmZD1XREkmZj1JbmRpY2F0b3JfQ29kZSUzYUlRLkNQQS5CUkVHLlhRKQoxNS4gIE9FQ0QgQ0lQIGNvdW50cnkgd2VpZ2h0OiAgaHR0cHM6Ly9kYXRhLWV4cGxvcmVyLm9lY2Qub3JnL3Zpcz9mc1swXT1Ub3BpYyUyQzAlN0NFY29ub215JTIzRUNPJTIzJmZzWzFdPVRvcGljJTJDMSU3Q0Vjb25vbXklMjNFQ08lMjMlN0NQcmljZXMlMjNFQ09fUFJJJTIzJnBnPTAmZmM9VG9waWMmc25iPTE2JmRmW2RzXT1kc0Rpc3NlbWluYXRlRmluYWxETVomZGZbaWRdPURTRF9DUElfQ09VX1dFSUdIVFMlNDBERl9DUElfQ1RSWV9XRUlHSFRTJmRmW2FnXT1PRUNELlNERC5UUFMmZGZbdnNdPTEuMCZwZD0lMkMmZHE9LkEuLiZseVtyd109UkVGX0FSRUEmbHlbY2xdPVRJTUVfUEVSSU9EJnRvW1RJTUVfUEVSSU9EXT1mYWxzZSZsbz01JmxvbT1MQVNUTlBFUklPRFMKMTYuICBPRUNEOiBWZW50dXJlIGNhcGl0YWwgaW52ZXN0bWVudHMgKG1hcmtldCBzdGF0aXN0aWNzKSwgR3Jvc3MgZG9tZXN0aWMgcHJvZHVjdCAoR0RQKQoxNy4gIE9FQ0Q6IGh0dHBzOi8vZGF0YS1leHBsb3Jlci5vZWNkLm9yZy92aXM/ZnNbMF09VG9waWMlMkMxJTdDU29jaWV0eSUyM1NPQyUyMyU3Q1dlbGwtYmVpbmclMjBhbmQlMjBiZXlvbmQlMjBHRFAlMjNTT0NfV0VMJTIzJnBnPTAmZmM9VG9waWMmYnA9dHJ1ZSZzbmI9MiZ2dz10YiZkZltkc109ZHNEaXNzZW1pbmF0ZUZpbmFsRE1aJmRmW2lkXT1EU0RfQ1dCJTQwREZfQ1dCJmRmW2FnXT1PRUNELldJU0UuQ1dCJmRmW3ZzXT0xLjAmcGQ9MjAxOCUyQzIwMTgmZHE9LkE0XzMlMkJBNF8yJTJCQTRfNi5BNCZseVtjbF09TUVBU1VSRSZseVtyd109UkVGX0FSRUEmdG9bVElNRV9QRVJJT0RdPWZhbHNlCjE4LiBPRUNEOiBUZXJ0aWFyeSBncmFkdWF0aW9uIHJhdGUgb2Ygd29tZW4gKFBoRCBncmFkdWF0aW9uLCB3b21lbikgW0xpbmtdKCBodHRwczovL2RhdGEub2VjZC5vcmcvc3R1ZGVudHMvdGVydGlhcnktZ3JhZHVhdGlvbi1yYXRlLmh0bSkKMTkuIE9FQ0Q6IFRheCBvbiBwZXJzb25hbCBpbmNvbWUgIFtMaW5rXShodHRwczovL3N0YXRzLm9lY2Qub3JnL3NkbXgtanNvbi9kYXRhL0RQX0xJVkUvLlRBWElOQ09NRS5UT1QuUENfR0RQLkEvT0VDRD9jb250ZW50VHlwZT1jc3YmZGV0YWlsPWNvZGUmc2VwYXJhdG9yPWNvbW1hJmNzdi1sYW5nPWVuJnN0YXJ0UGVyaW9kPTIwMDApCjIwLiBPRUNEOiDigJxJQ1QgQWNjZXNzIGFuZCBVc2FnZSBieSBJbmRpdmlkdWFsc+KAnSBbVVJMIENTVl0oaHR0cHM6Ly9zZG14Lm9lY2Qub3JnL3B1YmxpYy9yZXN0L2RhdGEvT0VDRC5TVEkuU1RQLERTRF9NU1RJQERGX01TVEksMS4xLy5BLkcuUFRfQjFHUS4uP3N0YXJ0UGVyaW9kPTIwMTQmZGltZW5zaW9uQXRPYnNlcnZhdGlvbj1BbGxEaW1lbnNpb25zJmZvcm1hdD1jc3ZmaWxld2l0aGxhYmVscyksIOKAnE1haW4gU2NpZW5jZSBhbmQgVGVjaG5vbG9neSBJbmRpY2F0b3Jz4oCdIFtVUkwgRXhjZWxdKGh0dHBzOi8vZGF0YWNhdGFsb2dmaWxlcy53b3JsZGJhbmsub3JnL2RkaC1wdWJsaXNoZWQvMDAzNzcxMi9EUjAwOTA3NTUvQ0xBU1MueGxzeCkKMjEuIE9FQ0Q6IGZsdWN0dWF0aW9ucyBieSBhbmFseXppbmcgdGhlIGNhdGNoIGZpbGVzOgoyMi4gT0VDRCBDaGlsZCBXZWxsLUJlaW5nOiBbTGlua10oaHR0cHM6Ly9kYXRhLWV4cGxvcmVyLm9lY2Qub3JnL3Zpcz9mc1swXT1Ub3BpYyUyQzElN0NTb2NpZXR5JTIzU09DJTIzJTdDV2VsbC1iZWluZyUyMGFuZCUyMGJleW9uZCUyMEdEUCUyM1NPQ19XRUwlMjMmcGc9MCZmYz1Ub3BpYyZicD10cnVlJnNuYj0yJnZ3PXRiJmRmW2RzXT1kc0Rpc3NlbWluYXRlRmluYWxETVomZGZbaWRdPURTRF9DV0IlNDBERl9DV0ImZGZbYWddPU9FQ0QuV0lTRS5DV0ImZGZbdnNdPTEuMCZwZD0yMDE4JTJDMjAxOCZkcT0uQTRfMyUyQkE0XzIlMkJBNF82LkE0Jmx5W2NsXT1NRUFTVVJFJmx5W3J3XT1SRUZfQVJFQSZ0b1tUSU1FX1BFUklPRF09ZmFsc2UpCgoKIyBFeGFtcGxlcwoKIyMgVU4gRGF0YSBvbiBFZHVjYXRpb24KCipMZXQgbWUgaWxsdXN0cmF0ZSBzdGVwcyB1c2luZyB0aGUgZm9sbG93aW5nIGluZGljYXRvcnMuIElzc3VlcyBhcmUgbm90IHRha2VuIGZyb20gdGhlIGFuYWx5c2lzIG9mIHRoZSBvbmUgd2hvIGNob3NlIHRoZXNlIGluZGljYXRvcnMuKgoKMS4gIFVOIERhdGEgLSBHb3Zlcm5tZW50IGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiBhcyAlIG9mIEdEUDogW0xpbmtdKGh0dHBzOi8vZGF0YS51bi5vcmcvRGF0YS5hc3B4P3E9ZWR1Y2F0aW9uK2V4cGVuZGl0dXJlJmQ9VU5FU0NPJmY9c2VyaWVzJTNhWEdEUF9GU0dPViksIAoKMi4gIFVOIERhdGEgLSBHcm9zcyBFbnJvbGxtZW50IFJhdGlvIC0gVGVydGlhcnkgRWR1Y2F0aW9uOiBbTGlua10oaHR0cHM6Ly9kYXRhLnVuLm9yZy9EYXRhLmFzcHg/cT10ZXJ0aWFyeSZkPUdlbmRlclN0YXQmZj1pbklEJTNhNjUpCgoqV2hlbiBkb3dubG9hZCB0aGUgZGF0YSwgY2hvb3NlIGNvdW50cnkgY29kZXMgZnJvbSAnU2VsZWN0IGNvbHVtbnMnLiBUaGUgZmlyc3QgZGF0YSBhZGRzIGlzbzNjIGNvZGVzIGFuZCB0aGUgc2Vjb25kIGFkZHMgVU4gbnVtYmVyIGNvZGVzLioKCipJdCBpcyBoZWxwZnVsIHRvIGFkZCBsaW5rcyB0byB0aGUgc2l0ZS4qCgojIyMgU2V0IHVwCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmBgYAoKKkNyZWF0ZSBkYXRhIGZvbGRlciBpZiB5b3UgZG8gbm90IGhhdmUgaXQgdW5kZXIgRmlsZXMuKgoKYGBge3IgZXZhbD1GQUxTRX0KZGlyLmNyZWF0ZSgiZGF0YSIpCmBgYAoKKklmIHlvdSBkbyBub3QgaGF2ZSBgd2RpY2FjaGUucmRzYCBpbiB5b3VyIGRhdGEgZm9sZGVyLCBydW4gdGhlIGZvbGxvd2luZyB0d28gY29kZSBjaHVua3MuKgoKYGBge3Igd2RpY2FjaGUsIGV2YWw9RkFMU0V9CndkaWNhY2hlIDwtIFdESWNhY2hlKCkKYGBgCgpgYGB7ciB3cml0ZXdkaWNhY2hlLCBldmFsPUZBTFNFLCBlY2hvPUZBTFNFfQp3cml0ZV9yZHMod2RpY2FjaGUsICJkYXRhL3dkaWNhY2hlLnJkcyIpCmBgYAoKYGBge3IgcmVhZHdkaWNhY2hlLCBlY2hvPUZBTFNFfQp3ZGljYWNoZSA8LSByZWFkX3JkcygiZGF0YS93ZGljYWNoZS5yZHMiKQpgYGAKCmBgYHtyfQp3ZGlfY291bnRyeV9leHRyYSA8LSB3ZGljYWNoZSRjb3VudHJ5IHw+IHNlbGVjdChpc28zYywgcmVnaW9uLCBpbmNvbWUsIGxlbmRpbmcpCmBgYAoKIyMjIEluZm9ybWF0aW9uIG9mIERhdGEKCgojIyMgSW1wb3J0aW5nIERhdGEKCkdvIHRvIHRoZSBbZGF0YSBsaW5rXShodHRwczovL2RhdGEudW4ub3JnL0RhdGEuYXNweD9xPWVkdWNhdGlvbitleHBlbmRpdHVyZSZkPVVORVNDTyZmPXNlcmllcyUzYVhHRFBfRlNHT1YpLiBBZGQgUmVmZXJlbmNlIEFyZWEgQ29kZSBmcm9tIFNlbGVjdCBjb2x1bW4gb24gdG9wLiBDbGljayBVcGRhdGUuIFlvdSB3aWxsIHNlZSB0aGF0IGlzbzNjIGlzIGFkZGVkIGluIHRoZSBmaXJzdCBjb2x1bW4uIFRoZW4gZG93bmxvYWQgYSBDU1YgZmlsZSAoQ29tbWEpLiBZb3UgZ2V0ICdVTmRhdGFfRXhwb3J0XzIwMjQwMTMxXzAyNDc1ODAzMy5jc3YnLgoKTmV4dCBnbyB0aGUgdGhlIFtkYXRhIGxpbmtdKGh0dHBzOi8vZGF0YS51bi5vcmcvRGF0YS5hc3B4P3E9dGVydGlhcnkmZD1HZW5kZXJTdGF0JmY9aW5JRCUzYTY1KS4gU2ltaWxhcmx5LCBhZGQgQ291bnRyeSBvciBBcmVhIENvZGUgZnJvbSBTZWxlY3QgY29sdW1uIG9uIHRvcC4gQ2xpY2sgVXBkYXRlLiBZb3Ugd2lsbCBzZWUgdGhhdCBVTiBjb2RlIGlzIGFkZGVkIGluIHRoZSBmaXJzdCBjb2x1bW4uIFRoZW4gZG93bmxvYWQgYSBDU1YgZmlsZSAoQ29tbWEpLiBZb3UgZ2V0ICdkYXRhL1VOZGF0YV9FeHBvcnRfMjAyNDAxMzFfMDI0ODIwODAxLmNzdicuCgpQbGFjZSB0aGUgZG93bmxvYWRlZCBkYXRhICdVTmRhdGFfRXhwb3J0XzIwMjQwMTMxXzAyNDc1ODAzMy5jc3YnIGFuZCAnVU5kYXRhX0V4cG9ydF8yMDI0MDEzMV8wMjQ4MjA4MDEuY3N2JyBpbiB0aGUgZGF0YSBmb2xkZXIuCgpgYGB7cn0KZGZfZWRfZ292X2V4cCA8LSByZWFkX2NzdigiZGF0YS9VTmRhdGFfRXhwb3J0XzIwMjQwMTMxXzAyNDc1ODAzMy5jc3YiKQpkZl9lZF9nb3ZfZXhwCmBgYAoKYGBge3J9CmRmX2VkX2dvdl9leHAgfD4gc3RyKCkKYGBgCgoqKk9ic2VydmF0aW9uKioKCi0gVGhlcmUgYXJlIHNldmVuIGNvbHVtbnMuCi0gVGhlIGZpcnN0IGNvbHVtbiAnUmVmZXJlbmNlIEFyZWEgQ29kZScgaXMgJ2lzbzNjJy4KLSBUaGUgc2Vjb25kIGNvbHVtbiAnUmVmZXJlbmNlIEFyZWEnIHNlZW1zIHRvIGJlIHRoZSBjb3VudHJ5IG5hbWUuCi0gVGhlIHRoaXJkIGNvbHVtbiAnVGltZSBQZXJpb2QnIGlzIHllYXIuIEl0IGlzIGluIGBkYmxgLCBhbmQgc2hvdWxkIGJlIGluIGBpbnRlZ2VyYC4KLSBUaGUgZm91cnRoIGNvbHVtbiwgJ1NleCcgc3RhcnQgd2l0aCAiTm90IGFwcGxpY2FibGUiLiBQcm9iYWJseSwgbWFsZSBhbmQgZmVtYWxlIHdpbGwgYXBwZWFyLgotIFRoZSBmaWZ0aCBjb2x1bW4sICdBZ2UgZ3JvdXAnIHN0YXJ0IHdpdGggIk5vdCBhcHBsaWNhYmxlIi4gCi0gVGhlIHNpeHRoIGNvbHVtbiwgJ1VuaXRzIG9mIG1lYXN1cmVtZW50JyBzdGFydHMgd2l0aCAiUGVyY2VudCIuCi0gVGhlIHNldmVudGggY29sdW1uLCAnT2JzZXJ2YXRpb24gVmFsdWUnIHNob3VsZCBiZSBudW1iZXJzIHJlcHJlbnRpbmcgdGhlIHBlcmNlbnQgb2YgR0RQLgoKIyMjIyBDaGVjayB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGVzCgpTZWxlY3QgdGhlIGNhdGVnb3JpY2FsIHZhaWFibGVzIHdlIHdhbnQgdG8gY2hlY2sgdGhlIHZhbHVlcy4KCmBgYHtyfQpkZl9lZF9nb3ZfZXhwIHw+IHNlbGVjdChgVGltZSBQZXJpb2RgLCBTZXgsIGBBZ2UgZ3JvdXBgLCBgVW5pdHMgb2YgbWVhc3VyZW1lbnRgKSB8PiBsYXBwbHkodW5pcXVlKQpgYGAKCldlIGRvIG5vdCBuZWVkIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSB3aXRoIG9ubHkgb25lIHZhbHVlLgoKV2l0aCAnc2VsZWN0JyB3ZSBjYW4gY2hhbmdlIHRoZSBuYW1lcyBvZiB0aGUgdmFyaWFibGVzIGFzIHdlbGwuIENoYW5nZSBgVGltZSBQZXJpb2RgIHRvIGludGVnZXIgdmFsdWVzLiBUaGVuIGRlbGV0ZSBgVGltZSBQZXJpb2RgIGNvbHVtbi4gV2UgZG8gbm90IG5lZWQgcXVvdGF0aW9uIG1hcmtzIGZvciBjb2x1bW4gbmFtZXMsIGJ1dCBpZiB0aGVyZSBpcyBhIHNwYWNlIGluIHRoZSBjb2x1bW4gbmFtZSwgd2UgbmVlZCB0byBzdXJyb3VuZCBieSBgIGAgYmFjayB0aWNrcy4KCmBgYHtyfQpkZl9nb3ZfZXhwIDwtIGRmX2VkX2dvdl9leHAgfD4gCiAgc2VsZWN0KGlzbzNjID0gYFJlZmVyZW5jZSBBcmVhIENvZGVgLCBjb3VudHJ5ID0gYFJlZmVyZW5jZSBBcmVhYCwgYFRpbWUgUGVyaW9kYCwgZ292X2V4cCA9IGBPYnNlcnZhdGlvbiBWYWx1ZWApIHw+IG11dGF0ZSh5ZWFyID0gYXMuaW50ZWdlcihgVGltZSBQZXJpb2RgKSwgLmFmdGVyID0gY291bnRyeSkgfD4gCiAgc2VsZWN0KC1gVGltZSBQZXJpb2RgKSB8PiBhcnJhbmdlKGNvdW50cnksIGlzbzNjLCB5ZWFyKQpkZl9nb3ZfZXhwCmBgYAoKTm93LCB3ZSByZWFjaGVkIGEgY2xlYW4gZGF0YS4gV2UgZG8gdGhlIHNhbWUgdG8gdGhlIHNlY29uZCBkYXRhLgoKYGBge3J9CmRmX3RlcnRpYXJ5X3JhdGlvIDwtIHJlYWRfY3N2KCJkYXRhL1VOZGF0YV9FeHBvcnRfMjAyNDAxMzFfMDI0ODIwODAxLmNzdiIpCmRmX3RlcnRpYXJ5X3JhdGlvCmBgYAoKYGBge3J9CmRmX3RlcnRpYXJ5X3JhdGlvIHw+IHN0cigpCmBgYAoKQmVzaWRlcyB0aGUgb25lcyB3ZSBub3RpY2VkIGluIHRoZSBmaXJzdCBkYXRhLCBzdXJwcmlzaW5nbHksIHRoZSBWYWx1ZSBpcyBpbiBjaGFyYWN0ZXIuIExldCBtZSBjaGVjay4KCmBgYHtyfQpkZl90ZXJ0aWFyeV9yYXRpbyRWYWx1ZSB8PiB1bmlxdWUoKQpgYGAKCldlIGNhbiBhc3N1bWUgdGhhdCB0aGVzZSBhcmUgbnVtYmVycy4KCmBgYHtyfQpkZl90ZXJ0aWFyeV9yYXRpbyB8PiBzZWxlY3QoU3ViZ3JvdXAsIFllYXIsIFNvdXJjZSwgVW5pdCwgYFZhbHVlIEZvb3Rub3Rlc2ApIHw+IGxhcHBseSh1bmlxdWUpCmBgYAoKYGBge3J9CmRmX3RlcnRpYXJ5IDwtIGRmX3RlcnRpYXJ5X3JhdGlvIHw+IHNlbGVjdCh1bl9jb2RlID0gYENvdW50cnkgb3IgQXJlYSBDb2RlYCwgY291bnRyeSA9IGBDb3VudHJ5IG9yIEFyZWFgLCBzZXggPSBTdWJncm91cCwgWWVhciwgdGVydGlhcnkgPSBWYWx1ZSkgfD4gbXV0YXRlKHllYXIgPSBhcy5pbnRlZ2VyKFllYXIpLCAuYmVmb3JlID0gc2V4LCB0ZXJ0aWFyeSA9IGFzLm51bWVyaWModGVydGlhcnkpKSB8PiBzZWxlY3QoLVllYXIpCmRmX3RlcnRpYXJ5CmBgYAoKSGVyZSwgd2UgY2hlY2sgdGhlIGxpc3Qgb2YgY291bnRyaWVzIGluIHR3byBkYXRhIHNldHMuCgpgYGB7cn0Kc2V0ZGlmZih1bmlxdWUoZGZfZ292X2V4cCRjb3VudHJ5KSwgdW5pcXVlKGRmX3RlcnRpYXJ5JGNvdW50cnkpKQpgYGAKCmBgYHtyfQpzZXRkaWZmKHVuaXF1ZShkZl90ZXJ0aWFyeSRjb3VudHJ5KSwgdW5pcXVlKGRmX2dvdl9leHAkY291bnRyeSkpCmBgYAoKV2UgY2FuIG9ic2VydmUgdGhhdCBtYW55IGNvdW50cnkgbmFtZXMgZG8gbm90IGFncmVlLiAKCioqQ291bnRyeSBOYW1lcyBhcmUgZGlmZmVyZW50LioqCgpOZXh0IGNoZWNrLCBpZiB3ZSBjYW4gcHJvcGVybHkgYXNzaWduIGBpc28zY2AgdG8gdGhlIHNlY29uZCBkYXRhLiAKVGhlIGZvbGxvd2luZyBzaG93cyB0aGF0IGV4Y2VwIHRoZSA4IGNvdW50cmllcyBiZWxvdywgYGlzbzNjYCBhcmUgYXNzaWduZWQuIAoKYGBge3J9CmRmX3RlcnRpYXJ5IHw+IAogIG11dGF0ZShpc28zYyA9IGNvdW50cnljb2RlKGNvdW50cnksICJjb3VudHJ5Lm5hbWUiLCAiaXNvM2MiKSwgLmFmdGVyID0gdW5fY29kZSkgfD4gCiAgZmlsdGVyKGlzLm5hKGlzbzNjKSkgfD4gZGlzdGluY3QoY291bnRyeSkKYGBgCgpDaGVjayB3aGV0aGVyIHR3byBjb3VudHJpZXMgYXBwZWFyIGluIHRoZSBmaXJzdCBkYXRhLgoKYGBge3J9CmRmX2dvdl9leHAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBjKCJOZXRoZXJsYW5kcyBBbnRpbGxlcyIsICJTZXJiaWEgYW5kIE1vbnRlbmVncm8iKSkKYGBgCgpMZXQgdXMgYXNzaWduIGBpc28zY2AgYW5kIGRlbGV0ZSB0aGUgcm93cyB3aGljaCB3ZSBjYW5ub3QgYXNzaWduIGBpc28zY2AuCgpgYGB7cn0KZGZfdGVydGlhcnkxIDwtIGRmX3RlcnRpYXJ5IHw+IAogIG11dGF0ZShpc28zYyA9IGNvdW50cnljb2RlKGNvdW50cnksICJjb3VudHJ5Lm5hbWUiLCAiaXNvM2MiKSwgLmFmdGVyID0gdW5fY29kZSkgfD4gCiAgc2VsZWN0KC1jb3VudHJ5LCAtdW5fY29kZSkgfD4gZmlsdGVyKCFpcy5uYShpc28zYykpCmRmX3RlcnRpYXJ5MQpgYGAKCk5vdyB3ZSBjb21iaW5lIHRoZXNlIHR3byBkYXRhc2V0cy4gV2UgcmVhY2hlZCBhIHJlYXNvbmFibHkgY2xlYW4gY29tYmluZWQgZGF0YXNldC4KCmBgYHtyfQpkZl91bl9lZF9jb21iaW5lZCA8LSBkZl9nb3ZfZXhwIHw+IGZ1bGxfam9pbihkZl90ZXJ0aWFyeTEsIGJ5ID0gYygiaXNvM2MiLCAieWVhciIpKQpkZl91bl9lZF9jb21iaW5lZApgYGAKCiMjIyBGaXZlIGNob3NlbiBjb3VucmllcycgZ292ZXJubWVudCBleHBlbmRpY3VyZSBvbiBlZHVjYXRpb24KCmBgYHtyfQpkZl91bl9lZF9jb21iaW5lZCB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIGMoIkphcGFuIiwgIlZpZXQgTmFtIiwgIkNoaW5hIiwgIlJlcHVibGljIG9mIEtvcmVhIiwgIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpKSB8PiBkcm9wX25hKGdvdl9leHApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBnb3ZfZXhwLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJGaXZlIENvdW50cmllcycgR292ZXJtZW50IEV4cGVuZGl0dXJlIG9uIEVkdWNhdGlvbiIpCmBgYAoKYGBge3J9CmRmX3VuX2VkX2NvbWJpbmVkIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgYygiSmFwYW4iLCAiVmlldCBOYW0iLCAiQ2hpbmEiLCAiUmVwdWJsaWMgb2YgS29yZWEiLCAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIikpIHw+IGRyb3BfbmEodGVydGlhcnkpCmBgYAoKIyMjIEZpdmUgY291bnJ0aWVzJyB0ZXJ0aWFyeSBlZHVjYXRvbiBlbnJvbGVtZW50CgpgYGB7cn0KZGZfdW5fZWRfY29tYmluZWQgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBjKCJKYXBhbiIsICJWaWV0IE5hbSIsICJDaGluYSIsICJSZXB1YmxpYyBvZiBLb3JlYSIsICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKSkgfD4gZHJvcF9uYSh0ZXJ0aWFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHRlcnRpYXJ5LCBjb2wgPSBjb3VudHJ5LCBsaW5ldHlwZSA9IHNleCkpICsgZ2VvbV9saW5lKCkKYGBgCgpgYGB7cn0KZGZfdW5fZWRfY29tYmluZWQgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBjKCJKYXBhbiIsICJWaWV0IE5hbSIsICJDaGluYSIsICJSZXB1YmxpYyBvZiBLb3JlYSIsICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKSkgfD4gZHJvcF9uYSh0ZXJ0aWFyeSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHRlcnRpYXJ5LCBjb2wgPSBjb3VudHJ5LCBsaW5ldHlwZSA9IHNleCkpICsgZ2VvbV9saW5lKCkgKyAKICBzY2FsZV95X2xvZzEwKCkgKyBsYWJzKHRpdGxlID0gIkdyb3NzIEVucm9sbWVudCBSYXRpbyBpbiBUZXJ0aWFyeSBFZHVjYXRpb24iLCBzdWJ0aXRsZSA9ICJMb2cgMTAgU2NhbGUgaW4gTnVtYmVyIikKYGBgCgojIyMgQ29tYmluZSB3ZGljYWNoZQoKYGBge3J9CmRmX3VuX2VkX2NvbWJpbmVkX2V4dCA8LSBkZl91bl9lZF9jb21iaW5lZCB8PiBsZWZ0X2pvaW4od2RpX2NvdW50cnlfZXh0cmEsIGJ5ID0gJ2lzbzNjJykKZGZfdW5fZWRfY29tYmluZWRfZXh0CmBgYAoKIyMgSHVtYW4gcmVzb3VyY2VzIGluIFJlc2VhcmNoIGFuZCBEZXZlbG9wbWVudAoKIyMjIFByZXBhcmF0aW9uCgpgYGB7cn0Kd2RpY2FjaGUgPC0gcmVhZF9yZHMoImRhdGEvd2RpY2FjaGUucmRzIikKd2RpX2NvdW50cnlfZXh0cmEgPC0gd2RpY2FjaGUkY291bnRyeSB8PiBzZWxlY3QoaXNvMmMsIHJlZ2lvbiwgaW5jb21lKQpgYGAKCmBgYHtyfQpJTkNPTUUgPC0gYygiSGlnaCBpbmNvbWUiLCAiVXBwZXIgbWlkZGxlIGluY29tZSIsICJMb3dlciBtaWRkbGUgaW5jb21lIiwgIkxvdyBpbmNvbWUiKQpgYGAKCmBgYHtyfQpCUklDUyA8LSBjKCJCcmF6aWwiLCAiUnVzc2lhbiBGZWRlcmF0aW9uIiwgIkluZGlhIiwgIkNoaW5hIiwgIlNvdXRoIEFmcmljYSIpCmBgYAoKYGBge3J9Ckc3IDwtIGMoIkNhbmFkYSIsICJGcmFuY2UiLCAiR2VybWFueSIsICJJdGFseSIsICJKYXBhbiIsICJVbml0ZWQgS2luZ2RvbSIsICJVbml0ZWQgU3RhdGVzIikKYGBgCgojIyMgSW1wb3J0aW5nIERhdGEKCmBgYHtyfQp1cmxfdW5fUl9EIDwtICJodHRwczovL2RhdGEudW4ub3JnL19Eb2NzL1NZQi9DU1YvU1lCNjZfMjg1XzIwMjMxMF9SZXNlYXJjaCUyMGFuZCUyMERldmVsb3BtZW50JTIwU3RhZmYlMjBhbmQlMjByZXNlYXJjaGVycyUyMGluJTIwZnVsbCUyMHRpbWUlMjBlcXVpdmFsZW50LmNzdiIKYGBgCgpgYGB7cn0KZGZfdW5fUl9EIDwtIHJlYWRfY3N2KHVybF91bl9SX0QsIHNraXAgPSAxKQpgYGAKCmBgYHtyfQpkZl91bl9SX0QKYGBgCgpgYGB7cn0Kc3RyKGRmX3VuX1JfRCkKYGBgCgpgYGB7cn0KZGZfdW5fUl9EIHw+IHNlbGVjdChTZXJpZXMsIEZvb3Rub3RlcywgU291cmNlKSB8PiBsYXBwbHkodW5pcXVlKQpgYGAKCiMjIyBUcmFuc2Zvcm1pbmcgRGF0YQoKQWRkIGlzbzJjIGNvZGUsIGFuZCBjaGVjayB0aG9zZSB0aGUgbmFtZXMgbGlzdGVkIGluIC4uLjIgd2hvc2UgaXNvMmNfdW4gaXMgTkEuCkZyb20gdGhlIG91dHB1dCwgdGhlc2UgYXJlIGFsbCByZWdpb24gbmFtZXMuIFNvIGluIHRoZSBuZXh0IGNvZGUsIHdlIGRlbGV0ZSB0aGVtLgoKYGBge3J9CmxpYnJhcnkoY291bnRyeWNvZGUpCmBgYAoKCmBgYHtyfQpkZl91bl9SX0RfcmVnaW9uIDwtIGRmX3VuX1JfRCB8PiAKICBtdXRhdGUoaXNvMmMgPSBjb3VudHJ5Y29kZShgUmVnaW9uL0NvdW50cnkvQXJlYWAsICJ1biIsICJpc28yYyIpLCAuYWZ0ZXIgPSAuLi4yKSB8PgogIGZpbHRlcihpcy5uYShpc28yYykpIApkZl91bl9SX0RfcmVnaW9uIHw+IGRpc3RpbmN0KC4uLjIpCmBgYAoKYGBge3J9CmRmX3VuX1JfRCB8PiAKICBtdXRhdGUoaXNvMmMgPSBjb3VudHJ5Y29kZShgUmVnaW9uL0NvdW50cnkvQXJlYWAsICJ1biIsICJpc28yYyIpLCAuYWZ0ZXIgPSAuLi4yKSB8PgogIGZpbHRlcighaXMubmEoaXNvMmMpKSB8PiAKICBzZWxlY3QoY291bnRyeSA9IC4uLjIsIGlzbzJjLCB5ZWFyID0gWWVhciwgc2VyaWVzID0gU2VyaWVzLCB2YWx1ZSA9IFZhbHVlKSB8PgogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBzZXJpZXMsIHZhbHVlc19mcm9tID0gdmFsdWUpCmBgYAoKVGhlIGZvbGxvd2luZyBpcyBhbm90aGVyIHdheSBvZiByZW5hbWluZyBzZXJpZXMgbmFtZXMsIGFuIGFsdGVybmF0aXZlIHRvIHVzZSBtdXRhdGUtY2FzZV93aGVuLgpUaGUgb3BlcmF0aW9uIGBwaXZvdF93aWRlcmAgaXMgdGhlIGNvbnZlcnNlIG9wZXJhdGlvbiB0byBgcGl2b3RfbG9uZ2VyYC4KClRoZSB1bml0cyBvZiB0d28gaW5kaWNhdG9ycyBhcmUgZGlmZmVyZW50LiBPbmUgaXMgaW4gcGVyY2VudCBvZiBHRFAsIGFuZCB0aGUgb3RoZXIgaXMgdGhlIG51bWJlciBvZiByZXNlYXJjaGVycyBpbiBvbmUgbWlsbGlvbiBpbmhhYml0YW50cy4gU28gaXQgaXMgYmV0dGVyIHRvIGhhbmRsZSB0aGUgZGF0YSBpbiB3aWRlIGZvcm1hdCBpbnN0ZWFkIG9mIHRoYXQgaW4gbG9uZyBkYXRhLiAKCmBgYHtyfQpkZl9SX0Rfd2lkZSA8LSBkZl91bl9SX0QgfD4gCiAgbXV0YXRlKGlzbzJjID0gY291bnRyeWNvZGUoYFJlZ2lvbi9Db3VudHJ5L0FyZWFgLCAidW4iLCAiaXNvMmMiKSwgLmFmdGVyID0gLi4uMikgfD4KICBmaWx0ZXIoIWlzLm5hKGlzbzJjKSkgfD4gCiAgc2VsZWN0KGNvdW50cnkgPSAuLi4yLCBpc28yYywgeWVhciA9IFllYXIsIHNlcmllcyA9IFNlcmllcywgdmFsdWUgPSBWYWx1ZSkgfD4KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gc2VyaWVzLCB2YWx1ZXNfZnJvbSA9IHZhbHVlKSB8PgogIHJlbmFtZShyZF9leHAgPSBgR3Jvc3MgZG9tZXN0aWMgZXhwZW5kaXR1cmUgb24gUiZEOiBhcyBhIHBlcmNlbnRhZ2Ugb2YgR0RQYCwgcmVzZWFyY2hlciA9IGBSZXNlYXJjaGVycyBwZXIgbWlsbGlvbiBpbmhhYml0YW50cyAoRlRFKWApCmRmX1JfRF93aWRlCmBgYAoKYGBge3J9CmRmX1JfRF9yZWdpb25fd2lkZSA8LSBkZl91bl9SX0RfcmVnaW9uIHw+IHNlbGVjdChjb3VudHJ5ID0gLi4uMiwgeWVhciA9IFllYXIsIHNlcmllcyA9IFNlcmllcywgdmFsdWUgPSBWYWx1ZSkgfD4KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gc2VyaWVzLCB2YWx1ZXNfZnJvbSA9IHZhbHVlKSB8PgogIHJlbmFtZShyZF9leHAgPSBgR3Jvc3MgZG9tZXN0aWMgZXhwZW5kaXR1cmUgb24gUiZEOiBhcyBhIHBlcmNlbnRhZ2Ugb2YgR0RQYCwgcmVzZWFyY2hlciA9IGBSZXNlYXJjaGVycyBwZXIgbWlsbGlvbiBpbmhhYml0YW50cyAoRlRFKWApCmRmX1JfRF9yZWdpb25fd2lkZQpgYGAKCmBgYHtyfQpkZl9SX0Rfd2lkZV9leHRyYSA8LSBkZl9SX0Rfd2lkZSB8PiBsZWZ0X2pvaW4od2RpX2NvdW50cnlfZXh0cmEsIGJ5ID0gImlzbzJjIikKZGZfUl9EX3dpZGVfZXh0cmEKYGBgCgpgYGB7cn0KZGZfUl9EX2V4dHJhIDwtIGRmX1JfRF93aWRlX2V4dHJhIHw+IHBpdm90X2xvbmdlcihjb2xzID0gYyhyZF9leHAsIHJlc2VhcmNoZXIpKQpkZl9SX0RfZXh0cmEKYGBgCgojIyMgVmlzdWFsaXphdGlvbgoKIyMjIyBCYXIgQ2hhcnQKCkl0IGlzIGltcG9ydGFudCB0byBjaGVjayB0aGUgbnVtYmVyIG9mIGRhdGEgaW4gZWFjaCB5ZWFyLgoKYGBge3J9CmRmX1JfRF9leHRyYSB8PiBkcm9wX25hKHZhbHVlKSB8PiAKICBnZ3Bsb3QoYWVzKHllYXIsIGZpbGwgPSBuYW1lKSkgKyBnZW9tX2JhcigpICsgbGFicyh0aXRsZSA9ICJDb3VudCBvZiBkYXRhIikKYGBgCgojIyMjIFNjYXR0ZXIgUGxvdAoKYGBge3J9CmRmX1JfRF93aWRlX2V4dHJhIHw+IGRyb3BfbmEocmRfZXhwLCByZXNlYXJjaGVyKSB8PgogIGdncGxvdChhZXMocmRfZXhwLCByZXNlYXJjaGVyLCBjb2wgPSBpbmNvbWUpKSArIGdlb21fcG9pbnQoKSArCiAgbGFicyh0aXRsZSA9ICJTY2F0dGVycGxvdDogRXhwZW5kaXR1cmUgb24gUiZEIHZzIFJlc2VhcmNoZXJzIHBlciBtaWxsaW9uIiwgc3VidGl0bGUgPSAiYnkgaW5jb21lIGxldmVsIikKYGBgCgpgYGB7cn0KZGZfUl9EX3dpZGVfZXh0cmEgfD4gZHJvcF9uYShyZF9leHAsIHJlc2VhcmNoZXIpIHw+CiAgZ2dwbG90KGFlcyhyZF9leHAsIHJlc2VhcmNoZXIsIGNvbCA9IHJlZ2lvbikpICsgZ2VvbV9wb2ludCgpICsKICBsYWJzKHRpdGxlID0gIlNjYXR0ZXJwbG90OiBFeHBlbmRpdHVyZSBvbiBSJkQgdnMgUmVzZWFyY2hlcnMgcGVyIG1pbGxpb24iLCBzdWJ0aXRsZSA9ICJieSByZWdpb24iKQpgYGAKCmBgYHtyfQpkZl9SX0Rfd2lkZV9leHRyYSB8PiBkcm9wX25hKHJkX2V4cCwgcmVzZWFyY2hlcikgfD4gbG0ocmVzZWFyY2hlciB+IHJkX2V4cCwgZGF0YSA9IF8pIHw+CiAgc3VtbWFyeSgpCmBgYAoKYGBge3J9CmRmX1JfRF93aWRlX2V4dHJhIHw+IGRyb3BfbmEocmRfZXhwLCByZXNlYXJjaGVyKSB8PiBzZWxlY3QocmRfZXhwLCByZXNlYXJjaGVyKSB8PiBjb3IoKQpgYGAKClRoZSB2YWx1ZSBpcyB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIG11bHRpcGxlIFItc3F1YXJlZCBhYm92ZS4gVGhlcmUgdmFyaWFibGVzIGFyZSBzdHJvbmdseSBwb3NpdGl2ZWx5IGNvcnJlbGF0ZWQuCgoKIyMjIyBCb3hwbG90CgpgYGB7cn0KZGZfUl9EX3dpZGVfZXh0cmEgfD4gZmlsdGVyKHllYXIgJWluJSBjKDIwMDUsIDIwMTAsIDIwMTUsIDIwMjApKSB8PiBkcm9wX25hKHJkX2V4cCkgfD4KICBmaWx0ZXIoaW5jb21lICVpbiUgSU5DT01FKSB8PgogIGdncGxvdChhZXMoZmFjdG9yKGluY29tZSwgbGV2ZWxzID0gSU5DT01FKSwgcmRfZXhwKSkgKyBnZW9tX2JveHBsb3QoKSArIAogIGxhYnModGl0bGUgPSAiR3Jvc3MgZG9tZXN0aWMgZXhwZW5kaXR1cmUgb24gUiZEOiAlIG9mIEdEUCBieSBpbmNvbWUgbGV2ZWwiLCB4ID0gIiIsIHkgPSAiZXhwZW5kaXR1cmUgb24gUiZEIiApCmBgYAoKYGBge3J9CmRmX1JfRF93aWRlX2V4dHJhIHw+IGZpbHRlcih5ZWFyICVpbiUgYygyMDA1LCAyMDEwLCAyMDE1LCAyMDIwKSkgfD4gZHJvcF9uYShyZXNlYXJjaGVyKSB8PgogIGZpbHRlcihpbmNvbWUgJWluJSBJTkNPTUUpIHw+CiAgZ2dwbG90KGFlcyhmYWN0b3IoaW5jb21lLCBsZXZlbHMgPSBJTkNPTUUpLCByZXNlYXJjaGVyKSkgKyBnZW9tX2JveHBsb3QoKSArIAogIGxhYnModGl0bGUgPSAiUmVzZWFyY2hlcnMgcGVyIG1pbGxpb24gaW5oYWJpdGFudHMgKEZURSkgYnkgaW5jb21lIGxldmVsIiwgeCA9ICIiKQpgYGAKCmBgYHtyfQpkZl9SX0Rfd2lkZV9leHRyYSB8PiBmaWx0ZXIoeWVhciAlaW4lIGMoMjAwNSwgMjAxMCwgMjAxNSwgMjAyMCkpIHw+IGRyb3BfbmEocmRfZXhwKSB8PgogIGdncGxvdChhZXMocmVnaW9uLCByZF9leHApKSArIGdlb21fYm94cGxvdCgpICsgY29vcmRfZmxpcCgpICsgCiAgbGFicyh0aXRsZSA9ICJHcm9zcyBkb21lc3RpYyBleHBlbmRpdHVyZSBvbiBSJkQ6ICUgb2YgR0RQICIsIHggPSAiIiwgeSA9ICJleHBlbmRpdHVyZSBvbiBSJkQiKQpgYGAKCmBgYHtyfQpkZl9SX0Rfd2lkZV9leHRyYSB8PiBmaWx0ZXIoeWVhciAlaW4lIGMoMjAwNSwgMjAxMCwgMjAxNSwgMjAyMCkpIHw+IGRyb3BfbmEocmVzZWFyY2hlcikgfD4KICBnZ3Bsb3QoYWVzKHJlZ2lvbiwgcmVzZWFyY2hlcikpICsgZ2VvbV9ib3hwbG90KCkgKyBjb29yZF9mbGlwKCkgKyAKICBsYWJzKHRpdGxlID0gIlJlc2VhcmNoZXJzIHBlciBtaWxsaW9uIGluaGFiaXRhbnRzIChGVEUpIGJ5IHJlZ2lvbiIsIHggPSAiIikKYGBgCgpUaGUgdmFyaWFibGUgYHllYXJgIGlzIGluIGludGVnZXJzIHdoaWNoIGlzIGEgbnVtZXJpY2FsIHZhcmlhYmxlLiBTbyBpbiBvcmRlciB0byB0YWtlIGl0IGFzIGEgY2F0ZWdvcmljYWwgdmFyaWFibGUsIHdlIHVzZSBgZmFjdG9yKHllYXIpYC4gCgpgYGB7cn0KZGZfUl9EX3dpZGVfZXh0cmEgfD4gZmlsdGVyKHllYXIgJWluJSBjKDIwMDUsIDIwMTAsIDIwMTUsIDIwMjApKSB8PiBkcm9wX25hKHJkX2V4cCkgfD4KICBnZ3Bsb3QoYWVzKGZhY3Rvcih5ZWFyKSwgcmRfZXhwKSkgKyBnZW9tX2JveHBsb3QoKSArIAogIGxhYnModGl0bGUgPSAiR3Jvc3MgZG9tZXN0aWMgZXhwZW5kaXR1cmUgb24gUiZEOiAlIG9mIEdEUCAiLCB4ID0gInllYXIiLCB5ID0gImV4cGVuZGl0dXJlIG9uIFImRCIpCmBgYAoKYGBge3J9CmRmX1JfRF93aWRlX2V4dHJhIHw+IGZpbHRlcih5ZWFyICVpbiUgYygyMDA1LCAyMDEwLCAyMDE1LCAyMDIwKSkgfD4gZHJvcF9uYShyZXNlYXJjaGVyKSB8PgogIGdncGxvdChhZXMoZmFjdG9yKHllYXIpLCByZXNlYXJjaGVyKSkgKyBnZW9tX2JveHBsb3QoKSArIAogIGxhYnModGl0bGUgPSAiUmVzZWFyY2hlcnMgcGVyIG1pbGxpb24gaW5oYWJpdGFudHMgKEZURSkgYnkgeWVhciIsIHggPSAieWVhciIsIHkgPSAiZXhwZW5kaXR1cmUgb24gUiZEIikKYGBgCgojIyMjIExpbmUgQ2hhcnQKCmBgYHtyfQpkZl9SX0Rfd2lkZV9leHRyYSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIEc3KSB8PiBkcm9wX25hKHJkX2V4cCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHJkX2V4cCwgY29sID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkgKyAKICBsYWJzKHRpdGxlID0gIkc3IGNvdW50cmllczogR3Jvc3MgZG9tZXN0aWMgZXhwZW5kaXR1cmUgb24gUiZEOiAlIG9mIEdEUCAiLCB5ID0gImV4cGVuZGl0dXJlIG9uIFImRCIpCmBgYAoKYGBge3J9CmRmX1JfRF93aWRlX2V4dHJhIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQlJJQ1MpIHw+IGRyb3BfbmEocmRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgcmRfZXhwLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArIAogIGxhYnModGl0bGUgPSAiQlJJQ1MgY291bnRyaWVzOiBHcm9zcyBkb21lc3RpYyBleHBlbmRpdHVyZSBvbiBSJkQ6ICUgb2YgR0RQICIseSA9ICJleHBlbmRpdHVyZSBvbiBSJkQiKQpgYGAKCmBgYHtyfQpkZl9SX0Rfd2lkZV9leHRyYSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIEc3KSB8PiBkcm9wX25hKHJlc2VhcmNoZXIpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCByZXNlYXJjaGVyLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSAgKyAKICBsYWJzKHRpdGxlID0gIkc3IGNvdW50cmllczogUmVzZWFyY2hlcnMgcGVyIG1pbGxpb24gaW5oYWJpdGFudHMgKEZURSkiKQpgYGAKCmBgYHtyfQpkZl9SX0Rfd2lkZV9leHRyYSB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIEJSSUNTKSB8PiBkcm9wX25hKHJlc2VhcmNoZXIpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCByZXNlYXJjaGVyLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArIAogIGxhYnModGl0bGUgPSAiQlJJQ1MgY291bnRyaWVzOiBSZXNlYXJjaGVycyBwZXIgbWlsbGlvbiBpbmhhYml0YW50cyAoRlRFKSIpCmBgYAoKYGBge3J9CmRmX1JfRF9yZWdpb25fd2lkZSB8PiBkaXN0aW5jdChjb3VudHJ5KQpgYGAKCmBgYHtyfQpkZl9SX0RfcmVnaW9uX3dpZGUgfD4gZHJvcF9uYShyZF9leHApIHw+CiAgZmlsdGVyKCEoY291bnRyeSAlaW4lIGMoIlRvdGFsLCBhbGwgY291bnRyaWVzIG9yIGFyZWFzIiwgIkF1c3RyYWxpYSBhbmQgTmV3IFplYWxhbmQiLCAiTExEQ3MiLCAiTERDXHhhNyIsICJTSURTIikpKSB8PiBnZ3Bsb3QoYWVzKHllYXIsIHJkX2V4cCwgY29sID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiR3Jvc3MgZG9tZXN0aWMgZXhwZW5kaXR1cmUgb24gUiZEOiAlIG9mIEdEUCBieSByZWdpb24iKQpgYGAKCmBgYHtyfQpkZl9SX0RfcmVnaW9uX3dpZGUgfD4gZHJvcF9uYShyZXNlYXJjaGVyKSB8PgogIGZpbHRlcighKGNvdW50cnkgJWluJSBjKCJUb3RhbCwgYWxsIGNvdW50cmllcyBvciBhcmVhcyIsICJBdXN0cmFsaWEgYW5kIE5ldyBaZWFsYW5kIiwgIkxMRENzIiwgIkxEQ1x4YTciLCAiU0lEUyIpKSkgfD4gZ2dwbG90KGFlcyh5ZWFyLCByZXNlYXJjaGVyLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJSZXNlYXJjaGVycyBwZXIgbWlsbGlvbiBpbmhhYml0YW50cyAoRlRFKSBieSByZWdpb24iKQpgYGAKCiMjIyMgQ29sdW1uIENoYXJ0CgpgYGB7cn0KcmRfZXhwX3JhbmtpbmcgPC0gZGZfUl9EX3JlZ2lvbl93aWRlIHw+IGZpbHRlcih5ZWFyID09IDIwMTUpIHw+IAogIGZpbHRlcighKGNvdW50cnkgJWluJSBjKCJUb3RhbCwgYWxsIGNvdW50cmllcyBvciBhcmVhcyIsICJBdXN0cmFsaWEgYW5kIE5ldyBaZWFsYW5kIiwgIkxMRENzIiwgIkxEQ1x4YTciLCAiU0lEUyIpKSkgfD4gZHJvcF9uYShyZF9leHApIHw+IGFycmFuZ2UocmRfZXhwKSB8PiBwdWxsKGNvdW50cnkpCnJkX2V4cF9yYW5raW5nCgpkZl9SX0RfcmVnaW9uX3dpZGUgfD4gZmlsdGVyKHllYXIgPT0gMjAxNSkgfD4gCiAgZmlsdGVyKCEoY291bnRyeSAlaW4lIGMoIlRvdGFsLCBhbGwgY291bnRyaWVzIG9yIGFyZWFzIiwgIkF1c3RyYWxpYSBhbmQgTmV3IFplYWxhbmQiLCAiTExEQ3MiLCAiTERDXHhhNyIsICJTSURTIikpKSB8PiBkcm9wX25hKHJkX2V4cCkgfD4KICBnZ3Bsb3QoYWVzKGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSByZF9leHBfcmFua2luZyksIHJkX2V4cCkpICsgZ2VvbV9jb2woKSArIGNvb3JkX2ZsaXAoKSArIAogIGxhYnModGl0bGU9Ikdyb3NzIGRvbWVzdGljIGV4cGVuZGl0dXJlIG9uIFImRDogJSBvZiBHRFAgYnkgcmVnaW9uIGluIDIwMTUiLCB4ID0gIiIsIHkgPSAiIikKYGBgCgpgYGB7cn0KcmVzZWFyY2hlcl9yYW5raW5nIDwtIGRmX1JfRF9yZWdpb25fd2lkZSB8PiBmaWx0ZXIoeWVhciA9PSAyMDE1KSB8PiAKICBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgYygiVG90YWwsIGFsbCBjb3VudHJpZXMgb3IgYXJlYXMiLCAiQXVzdHJhbGlhIGFuZCBOZXcgWmVhbGFuZCIsICJMTERDcyIsICJMRENceGE3IiwgIlNJRFMiKSkpIHw+IGRyb3BfbmEocmVzZWFyY2hlcikgfD4gYXJyYW5nZShyZXNlYXJjaGVyKSB8PiBwdWxsKGNvdW50cnkpCnJlc2VhcmNoZXJfcmFua2luZwoKZGZfUl9EX3JlZ2lvbl93aWRlIHw+IGZpbHRlcih5ZWFyID09IDIwMTUpIHw+IAogIGZpbHRlcighKGNvdW50cnkgJWluJSBjKCJUb3RhbCwgYWxsIGNvdW50cmllcyBvciBhcmVhcyIsICJBdXN0cmFsaWEgYW5kIE5ldyBaZWFsYW5kIiwgIkxMRENzIiwgIkxEQ1x4YTciLCAiU0lEUyIpKSkgfD4gZHJvcF9uYShyZXNlYXJjaGVyKSB8PgogIGdncGxvdChhZXMoZmFjdG9yKGNvdW50cnksIGxldmVscyA9IHJlc2VhcmNoZXJfcmFua2luZyksIHJlc2VhcmNoZXIsIGZpbGw9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSByZXNlYXJjaGVyX3JhbmtpbmcpKSkgKyBnZW9tX2NvbCgpICsgY29vcmRfZmxpcCgpICsgCiAgbGFicyh0aXRsZT0iUmVzZWFyY2hlcnMgcGVyIG1pbGxpb24gaW5oYWJpdGFudHMgKEZURSkgYnkgcmVnaW9uIGluIDIwMTUiLCB4ID0gIiIsIHkgPSAiIikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKCmBgYHtyfQpkZl9SX0RfcmVnaW9uX3dpZGUgfD4gZHJvcF9uYShyZXNlYXJjaGVyKSB8PgogIGZpbHRlcighKGNvdW50cnkgJWluJSBjKCJUb3RhbCwgYWxsIGNvdW50cmllcyBvciBhcmVhcyIsICJBdXN0cmFsaWEgYW5kIE5ldyBaZWFsYW5kIiwgIkxMRENzIiwgIkxEQ1x4YTciLCAiU0lEUyIpKSkgfD4gZ2dwbG90KGFlcyh5ZWFyLCByZXNlYXJjaGVyLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJSZXNlYXJjaGVycyBwZXIgbWlsbGlvbiBpbmhhYml0YW50cyAoRlRFKSBieSByZWdpb24iKQpgYGAKCgojIyBSZWZlcmVuY2UKClRoZSBSIE5vdGVib29rIGNvbnRhaW5zIHZhcmlvdXMgdGVjaG5pcXVlIG9uIHZpc3VhbGl6YXRpb24uIFtMaW5rXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9kYXRhLWFuYWx5c2lzL3dpcjIwMjIubmIuaHRtbCkKSSByZWNvbW1lbmQgYHJuYXR1cmFsZWFydGhgIGFuZCBgcm5hdHVyYWxlYXJ0aGRhdGFgIHBhY2thZ2VzIGludHJvZHVjZWQgaW4gY2xhc3MgZm9yIGNob3JvcGxldGggbWFwcy4g